Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

This noncompliant code example fails to persist the signal handler on Windows platforms and on those UNIX systems where handlers are not persistent by default.

Code Block
bgColor#ffcccc
langc
void handler(int signum) {
  /* Handle signal */
}

...

A common approach to create persistent signal handlers is to call signal() from within the handler itself, consequently, unresetting the reset signal.

Code Block
bgColor#ffcccc
langc
void handler(int signum) {
  if (signal(signum, handler) == SIG_ERR) {
    /* Handle error */
  }
  /* Handle signal */
}

...

The POSIX sigaction() function assigns handlers to signals in a manner similar to the C99 signal() function but also allows signal handler persistence to be controlled via the SA_RESETHAND flag. (Leaving the flag clear makes the handler persistent.)

Code Block
bgColor#ccccff
langc
/* Equivalent to signal(SIGUSR1, handler) but makes
 * signal persistent */
struct sigaction act;
act.sa_handler = handler;
act.sa_flags = 0;
if (sigemptyset(&act.sa_mask) != 0) {
  /* Handle error */
}
if (sigaction(SIGUSR1, &act, NULL) != 0) {
  /* Handle error */
}

...

This noncompliant code example fails to reset the signal handler to its default behavior on systems where handlers are persistent by default.

Code Block
bgColor#ffcccc
langc
void handler(int signum) {
  /* Handle signal */
}

...

A C99-compliant solution to reset the handler on a UNIX system is to rebind the signal to the default handler in the first line of the handler itself. Windows, however, automatically resets handlers to their default behavior.

Code Block
bgColor#ccccff
langc
void handler(int signum) {
#ifndef WINDOWS
  if (signal(signum, SIG_DFL) == SIG_ERR) {
    /* Handler error */
  }
#endif
  /* Handle signal */
}

...

The POSIX sigaction() function assigns handlers to signals in a manner similar to the C99 signal() function but also allows signal handler persistence to be controlled via the SA_RESETHAND flag. (Setting the flag makes the handler nonpersistent.)

Code Block
bgColor#ccccff
langc
/* Equivalent to signal(SIGUSR1, handler) but makes
 * signal nonpersistent */
struct sigaction act;
act.sa_handler = handler;
act.sa_flags = SA_RESETHAND;
if (sigemptyset(&act.sa_mask) != 0) {
  /* Handle error */
}
if (sigaction(SIGUSR1, &act, NULL) != 0) {
  /* Handle error */
}

...