Next: Flags for Sigaction, Previous: Signal and Sigaction, Up: Signal Actions

#### 24.3.4 `sigaction` Function Example

In Basic Signal Handling, we gave an example of establishing a simple handler for termination signals using `signal`. Here is an equivalent example using `sigaction`:

         #include <signal.h>

         void
         termination_handler (int signum)
         {
           struct temp_file *p;

           for (p = temp_file_list; p; p = p->next)
             unlink (p->name);
         }

         int
         main (void)
         {
           ...
           struct sigaction new_action, old_action;

           /* Set up the structure to specify the new action. */
           new_action.sa_handler = termination_handler;
           sigemptyset (&new_action.sa_mask);
           new_action.sa_flags = 0;

           sigaction (SIGINT, NULL, &old_action);
           if (old_action.sa_handler != SIG_IGN)
             sigaction (SIGINT, &new_action, NULL);
           sigaction (SIGHUP, NULL, &old_action);
           if (old_action.sa_handler != SIG_IGN)
             sigaction (SIGHUP, &new_action, NULL);
           sigaction (SIGTERM, NULL, &old_action);
           if (old_action.sa_handler != SIG_IGN)
             sigaction (SIGTERM, &new_action, NULL);
           ...
         }

The program just loads the `new_action` structure with the desired parameters and passes it in the `sigaction` call. The usage of `sigemptyset` is described later; see Blocking Signals.

As in the example using `signal`, we avoid handling signals previously set to be ignored. Here we can avoid altering the signal handler even momentarily, by using the feature of `sigaction` that lets us examine the current action without specifying a new one.

Here is another example. It retrieves information about the current action for `SIGINT` without changing that action.

         struct sigaction query_action;

         if (sigaction (SIGINT, NULL, &query_action) < 0)
           /* sigaction returns -1 in case of error. */
         else if (query_action.sa_handler == SIG_DFL)
           /* SIGINT is handled in the default, fatal manner. */
         else if (query_action.sa_handler == SIG_IGN)
           /* SIGINT is ignored. */
         else
           /* A programmer-defined signal handler is in effect. */