信号处理 - sigaction

优质
小牛编辑
128浏览
2023-12-01

本节包括sigaction函数和结构体sigaction两个部分。

函数sigaction

System Call用于测试和改变一个信号的行为。

函数原型

  1. #include <signal.h>
  2. int sigaction(int signum, const struct sigaction *act,
  3. struct sigaction *oldact);
参数描述
signum指定要改变的信号
act一个函数指针,如果不为空,则指定收到该信号后的行为
oldact如果oldact不为空,则将原行为保存在函数指针oldact中

结构体sigaction

结构体原型

  1. struct sigaction {
  2. void (*sa_handler)(int);
  3. void (*sa_sigaction)(int, siginfo_t *, void *);
  4. sigset_t sa_mask;
  5. int sa_flags;
  6. };

sa_handler

是一个函数指针,其含义与 signal 函数中的信号处理函数类似。

sa_sigaction

是另一个信号处理函数,它有三个参数,可以获得关于信号的更详细的信息。当 sa_flags 成员的值包含了 SA_SIGINFO 标志时,系统将使用 sa_sigaction 函数作为信号处理函数,否则使用 sa_handler 作为信号处理函数。

在某些系统中,成员 sa_handler 与 sa_sigaction 被放在联合体中,因此使用时不要同时设置。

sa_mask

成员用来指定在信号处理函数执行期间需要被屏蔽的信号,特别是当某个信号被处理时,它自身会被自动放入进程的信号掩码,因此在信号处理函数执行期间这个信号不会再度发生。

sa_flags

成员用于指定信号处理的行为,它可以是以下值的“按位或”组合。

  • SA_RESTART:使被信号打断的系统调用自动重新发起。
  • SA_ONSTACK:系统将在调用[[sigalstack|sigalstack]]替代信号栈上运行信号句柄;否则使用用户栈来交付信号。
  • SA_NOCLDSTOP:使父进程在它的子进程暂停或继续运行时不会收到 SIGCHLD 信号。
  • SA_NOCLDWAIT:使父进程在它的子进程退出时不会收到 SIGCHLD 信号,这时子进程如果退出也不会成为僵尸进程。
  • SA_NODEFER:使对信号的屏蔽无效,即在信号处理函数执行期间仍能发出这个信号。
  • SA_RESETHAND:信号处理之后重新设置为默认的处理方式。
  • SA_SIGINFO:使用 sa_sigaction 成员而不是 sa_handler 作为信号处理函数。

该段文字整理自博客园

相关函数

  • [[signal|signal]]
  • [[sigemptyset|sigemptyset]]