...
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.
|
Compliant Solution
Signal handlers should be as concise as possible, ideally unconditionally setting a flag and returning. They may also call the _Exit()
function.
list a few additional functions that are asynchronous-safe in OpenBSD but "probably not on other systems" including: snprintf()
, vsnprintf()
, and syslog_r()
(but only when the syslog_data struct
is initialized as a local variable).
Code Block | ||
---|---|---|
h2. Compliant Solution
Signal handlers should be as concise as possible, ideally unconditionally setting a flag and returning. They may also call the {{\_Exit()}} function.
{code:bgColor=#ccccff} | ||
Code Block | ||
| ||
#include <signal.h> void int_handler() { _Exit(0); } int main(void) { char *foo = (char *)malloc(sizeof("Hello World.")); if (foo == NULL) { /* handle error condition */ } signal(SIGINT, int_handler); strcpy(foo, "Hello World."); puts(foo); free(foo); return 0; } |
...