SIGACTION(2) | System Calls | SIGACTION(2) |
sigaction - detailed signal management
#include <signal.h> int sigaction(int sig, const struct sigaction *restrict act,
struct sigaction *restrict oact);
The sigaction() function allows the calling process to examine or specify the action to be taken on delivery of a specific signal. See signal.h(3HEAD) for an explanation of general signal concepts.
The sig argument specifies the signal and can be assigned any of the signals specified in signal.h(3HEAD) 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 includes the following members:
void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t sa_mask; int sa_flags;
The storage occupied by sa_handler and sa_sigaction may overlap, and a standard-conforming application (see standards(7)) must not use both simultaneously.
The sa_handler member identifies the action to be associated with the specified signal, if the SA_SIGINFO flag (see below) is cleared in the sa_flags field of the sigaction structure. It may take any of the values specified in signal.h(3HEAD) or that of a user specified signal handler. If the SA_SIGINFO flag is set in the sa_flags field, the sa_sigaction field specifies a signal-catching function.
The sa_mask member 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).
The sa_flags member 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_ONSTACK
SA_RESETHAND
SA_NODEFER
SA_RESTART
SA_SIGINFO
SA_NOCLDWAIT
SA_NOCLDSTOP
Upon successful completion, 0 is returned. Otherwise, −1 is returned, errno is set to indicate the error, and no new signal handler is installed.
The sigaction() function will fail if:
EINVAL
See attributes(7) for descriptions of the following attributes:
ATTRIBUTE TYPE | ATTRIBUTE VALUE |
Interface Stability | Committed |
MT-Level | Async-Signal-Safe |
Standard | See standards(7). |
kill(1), Intro(2), exit(2), fcntl(2), getmsg(2), ioctl(2), kill(2), pause(2), putmsg(2), read(2), sigaltstack(2), sigprocmask(2), sigsend(2), sigsuspend(2), waitid(2), write(2), signal(3C), sigsetops(3C), wait(3C), siginfo.h(3HEAD), signal.h(3HEAD), ucontext.h(3HEAD), recv(3SOCKET), send(3SOCKET), attributes(7), standards(7)
The handler routine can be declared:
void handler (int sig, siginfo_t *sip, void *arg);
The sig argument is the signal number. The sip argument is a pointer (to space on the stack) to a siginfo_t structure, which provides additional detail about the delivery of the signal. The arg argument is a pointer (again to space on the stack) to a ucontext_t structure (defined in <sys/ucontext.h>) which contains the context from before the signal. It is not recommended that arg be used by the handler to restore the context from before the signal delivery.
March 7, 2024 | OmniOS |