...
This rule is a special case of SIG31-C. Do not access or modify shared objects in signal handlers. The object designated by errno
is of static storage duration and is not a volatile sig_atomic_t
. As a result, performing any action that would require errno
to be set would normally cause undefined behavior. The C standard makes a special exception for errno
in this case, saying the only thing that is allowed to go wrong is that errno
takes on an indeterminate value. This makes it possible to call signal()
from within a signal handler without risking completely unrestricted undefined behavior, but the handler, and any code executed after the handler returns, must not depend on the value of errno
being meaningful.
...
Noncompliant Code Example
If the request to set the signal to default can be honored, the signal()
function returns the value of the signal handler for the most recent successful call to the signal()
function for the specified signal. Otherwise, a value of SIG_ERR
is returned and a positive value is stored in errno
.
...
Code Block | ||
---|---|---|
| ||
#include <signal.h> #include <stdlib.h> #include <string.h> typedef void (*pfv)(int); void handler(int signum) { pfv old_handler = signal(signum, SIG_DFL); if (old_handler == SIG_ERR) { abort(); } } int main(void) { pfv old_handler = signal(SIGINT, handler); if (old_handler == SIG_ERR) { perror("SIGINT handler"); /* handle error condition */ } /* main code loop */ return 0; } |
...
Noncompliant Code Example (POSIX)
POSIX is less restrictive than C99 about what applications can do in signal handlers. It has a long list of asynchronous-safe functions that can be called (see SIG30-C. Call only asynchronous-safe functions within signal handlers). Many of these functions set errno
on error. This can lead to a situation where a signal handler is executed in between a call to a failed function and the subsequent inspection of errno
, and consequently the value inspected is not the one set by that function but the one set by a function call in the signal handler. POSIX applications can avoid this problem by ensuring that signal handlers that contain code that might alter errno
always save the value of errno
on entry and restore it before returning.
The signal handler in this non-compliant noncompliant code example alters the value of errno
, and as a result it can cause incorrect error handling if executed in between a failed function call and the subsequent inspection of errno
.
...