Copyright (C) 2000-2012 |
GNU Info (libc.info)Sigaction Function Example`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. */ automatically generated by info2www version 1.2.2.9 |