#include <signal.h>int sigaction(int sig, const struct sigaction act, struct sigaction oact);
sig specifies the signal and can be assigned any of the signals specified in signal(5), except SIGKILL and SIGSTOP.
If the argument act is not NULL, it points to a structure specifying the new action to be taken when delivering sig. If the argument oact is not NULL, it points to a structure where the action previously associated with sig is to be stored on return from sigaction.
The sigaction structure is defined in sys/signal.h:
struct sigaction { int sa_flags; union { void (*sa__handler)(int); void (*sa__sigaction)(int, siginfo_t *, void *); } sa_u; sigset_t sa_mask; int sa_resv[2]; };#define sa_handler sa_u.sa__handler #define sa_sigaction sa_u.sa__sigaction
sa_handler specifies the disposition of the signal and may be SIG_DFL, SIG_IGN (see signal(2)), or a pointer to a signal catching (handling) function.
sa_mask specifies a set of signals to be blocked while the signal handler is active. On entry to the signal handler, that set of signals is added to the set of signals already being blocked when the signal is delivered. In addition, the signal that caused the handler to be executed will also be blocked, unless the SA_NODEFER flag has been specified. SIGSTOP and SIGKILL cannot be blocked (the system silently enforces this restriction).
sa_flags specifies a set of flags used to modify the delivery of the signal. It is formed by a logical OR of any of the following values:
sa_sigaction points to a signal catching function (see the description of SA_SIGINFO, below).
The SA_ONSTACK flag specifies that whenever the process receives the signal type sig the response is handled on an alternative stack. The location and size of the alternative stack is specified per LWP.
Alternate signal handling stacks can be defined via the sigaltstack(2) system call.
void func(int signo);where signo is the only argument to the signal catching function. In this case the
sa_handler
member must be used to describe the
signal catching function and the application must not modify the
sa_sigaction
member.
If SA_SIGINFO is set and the signal is caught, the signal-catching function will be entered as:
void func(int signo, siginfo_t *info, void *context );where two additional arguments are passed to the signal catching function. If the second argument is not a null pointer, it will point to an object of type siginfo_t explaining the reason why the signal was generated [see siginfo(5)]. The third argument can be cast to a pointer to an object of type ucontext_t to refer to the context of receiving process that was interrupted when the signal was delivered [see ucontext(5)].
In this latter case the sa_sigaction
member must be used to describe
the signal catching function and the application must not modify the
sa_handler
member.
The si_signo
member contains the system-generated signal number.
The si_errno
member, if non-zero, contains an error number
identifying the condition that caused the signal to be generated.
The si_code
member contains a code identifying the cause
of the signal.
If the value of si_code
is less than or equal to 0, then the
signal was generated by a process and si_pid
and
si_uid
respectively indicate the process ID and the
real user ID of the sender.
The values of si_pid
and si_uid
are otherwise meaningless.
The SA_WAITSIG signal type might be used by user level threads libraries trigger the creation of additional LWPs for the process.
The storage occupied by sa_handler
and sa_sigaction
may overlap, and a portable program must not use both simultaneously.
The Threads Library does not support alternate signal handling stacks for threads.
The SA_WAITSIG flag (see description above) can be used in support of threads libraries.
Further details can be found in signal(5).