1.介绍
sigaction()
是一个 Unix 系统调用,用于改变进程接收到特定信号时的行为。这是一个用于处理信号的非常强大的工具,它提供了对信号处理的更多控制,比 signal()
函数提供的更为复杂和灵活。
#include <signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
函数的参数说明:
-
signum
:这是你想要改变处理行为的信号。它通常是像SIGINT
、SIGTERM
、SIGSEGV
这样的预定义信号,也可以是其他的信号。 -
act
:这是一个指向sigaction
结构的指针,该结构定义了新的信号处理行为。结构的定义如下:
struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t sa_mask; int sa_flags; void (*sa_restorer)(void); };
sa_handler
是信号处理函数,它是一个函数指针,指向的函数接收一个整数参数(即信号编号)。
sa_sigaction
也是一个处理函数,但它接收三个参数,包括信号编号、一个指向 siginfo_t
的指针(提供有关信号的更多信息)以及一个指向 ucontext_t
的指针(提供有关被打断的上下文的信息)。
sa_mask
处理该信号时修改阻塞信号集,处理函数运行结束时恢复回原来的阻塞信号集。
sa_flags
用于修改行为的其他选项。可以控制进程收到信号时调用sa_handler
还是sa_sigaction
。
sa_restorer
通常不使用。
3.oldact
:如果这不是 NULL
,那么旧的信号处理行为会存储在这里。
2.例子
#include <stdio.h> #include <signal.h> void handler(int sig) { printf("Received signal %d\n", sig); } int main() { struct sigaction act; act.sa_handler = handler; sigemptyset(&act.sa_mask); act.sa_flags = 0; if (sigaction(SIGINT, &act, NULL) < 0) { perror("sigaction"); return 1; } for (;;) ; // Loop forever, waiting for signals return 0; }