...
The _Exit()
function called from within the int_handler()
signal handler causes immediate program termination, and is asynchronous-safe, whereas exit()
may call cleanup routines first, and is consequently not asynchronous-safe.
Implementation Details
OpenBSD
The OpenBSD signal()
man page identifies functions that are asynchronous-signal safe. Applications may consequently invoke them, without restriction, from signal-catching functions.
POSIX
Wiki Markup |
---|
The following table from the the Open Group Base Specifications \[[Open Group 04|AA. C References#Open Group 04]\] defines a set of functions that are asynchronous-signal-safe. Applications may consequently invoke them, without restriction, from signal-catching functions: |
...
Note that while raise()
is on the list of asynchronous-safe functions, it is specifically covered by SIG33-C. Do not recursively invoke the raise() function.
OpenBSD
The OpenBSD signal()
man page identifies functions that are asynchronous-signal safe. Applications may consequently invoke them, without restriction, from signal-catching functions.
The OpenBSD signal()
man page also says:
Code Block |
---|
A few other functions are signal race safe in OpenBSD but
probably not on other systems:
snprintf() Safe.
vsnprintf() Safe.
syslog_r() Safe if the syslog_data struct is initialized
as a local variable.
|
Note that, in general, I/O functions are not safe to invoke inside signal handlers. Check your system's asynchronous-safe functions before using them in signal handlers.
Compliant Solution
Signal handlers should be as concise as possible, ideally unconditionally setting a flag and returning. They may also call the _Exit()
function.
...