`sigaction' Function Example
----------------------------
In Note: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 Note: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. */