It is important to note that the 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 after the signal is triggered. Conversely, Linux/BSD systems leave the signal handler defined by the user in place until it is explicitly removed.
Implementation Details
Non-Compliant Code Example (Windows)
This non-complaint code example fails to persist the signal handler on Windows platformsThe following code runs differently on Linux and Windows.
Code Block |
---|
#include <stdio.h> #include <signal.h> volatile sig_atomic_t e_flag = 0; void handler(int signum) { e_flag = 1; } int main(void) { signal(SIGINT, handler); while(!e_flag) {} puts("Escaped from first while()"); e_flag = 0; while(!e_flag) {} puts("Escaped from second while()"); return 0; } |
...
When compiled with gcc 3.4.4 on and executed under Red Hat Linux, the signal handler is automatically reinstalled upon handler execution.
Code Block |
---|
% ./SIG01-A ^C Escaped from first while() ^C Escaped from second while() % |
Windows
When compiled with Microsoft Visual Studio 2005 , version 8.0 , and executed under Windows the signal handler is not automatically reinstalled.
...
The second interrupt executes the default action for SIGINT
, which is to terminate program execution.
Non-Compliant Code Example
A C99-compliant solution to persist the handler 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:.
Code Block |
---|
void handler(int signum) { signal(signum, handler); /* rest of handling code */ } |
References
Wiki Markup |
---|
\[[ISO/IEC 9899-1999TR2|AA. C References#ISO/IEC 9899-1999]\] "The {{signal}} function" |