You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 4 Next »

It is important to note that the signal function behaves a little differently in Windows than it does on Linux/BSD systems. When a signal handler is installed with the signal function in Windows, after the signal is triggered once, the default action is restored for that signal. Conversely, Linux/BSD systems leave the signal handler defined by the user in place until it is explicitly removed.

Implementation Details

The following code runs differently on Linux and Windows.

#include <stdio.h>
#include <signal.h>

volatile sig_atomic_t e_flag = 0;

void handler(int signum) {
	e_flag = 1;
}

int main() {
	signal(SIGINT, handler);
	while(!e_flag) {}
	puts("Escaped from first while()");

	e_flag = 0;
	while(!e_flag) {}
	puts("Escaped from second while()");

	return 0;
}

Linux

When compiled with gcc 3.4.4 on Red Hat Linux, the signal handler is automatically reinstalled upon handler execution.

% ./SIG01-A
^C
Escaped from first while()
^C
Escaped from second while()
%

Windows

When compiled with Microsoft Visual Studio 2005, version 8.0, the signal handler is not automatically reinstalled.

> SIG01-A.exe
^C
Escaped from first while()
^C
>

The second interrupt executes the default action for SIGINT, which is to terminate program execution.

If you desire the handler to persist on a Windows system, a standards-compliant solution is to rebind the signal to the handler in the first line of the handler itself:

void handler(int signum) {
   signal(signum, handler);

   /* rest of handling code */
}

References

[[ISO/IEC 9899-1999TR2]] "The signal function"

  • No labels