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.
h2. Implementation Details
The following code runs differently on Linux and Windows.
{code}
#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.
{code}
% ./SIG01-A
^C
Escaped from first while()
^C
Escaped from second while()
%
{code}
h3. Windows
When compiled with Microsoft Visual Studio 2005, version 8.0, the signal handler is not automatically reinstalled.
{code}
> SIG01-A.exe
^C
Escaped from first while()
^C
>
{code}
The second interrupt executes the default action for {{SIGINT}}, which is to terminate program execution.
If you |