...
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.
Code Block |
---|
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 |
Linux
When compiled with gcc 3.4.4
...
on
...
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() % {code} h3. Windows When compiled with Microsoft Visual Studio 2005, version |
Windows
When compiled with Microsoft Visual Studio 2005, version 8.0,
...
the
...
signal
...
handler
...
is
...
not
...
automatically
...
reinstalled.
Code Block |
---|
} > 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
...
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 */ } {code} |
References
Wiki Markup |
---|
\[[ISO/IEC 9899-1999TR2|AA. C References#ISO/IEC 9899-1999]\] "The {{signal}} function" |