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; } h3. 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()
%
h3. 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)
Unknown macro: { signal(signum, handler);
/* rest of handling code */}{code}