0%

信号(一)sigaction 函数

引言

sigaction 函数的功能是检查或修改(检查并修改)与指定信号相关的处理动作。此函数取代了早期 Unix 的 signal 函数。

1.0 函数声明

1
2
3
4
5
6
#include <sys/signal.h>

int sigaction( int signo,
const struct sigaction *restrict act,
struct sigaction *restrict oact
)

1.1 参数

  • signo
    要检测或者要修改其具体动作的信号编号。
  • act
    当该参数不为 NULL 时,指定要修改的新的动作。
  • oact
    当该参数不为 NULL 时,将该信号的上一个动作(更新前的动作)保存在该对象中。

    1.2 sigaction 结构体

    sigaction 函数的后两个参数都用到了该结构体。

1
2
3
4
5
6
7
8
9
#include <sys/signal.h>

struct sigaction
{
void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flag;
void (*sa_sigaction)(int,siginfo_t*,void*);
}
  • sa_handler
    信号处理函数的地址,也可以取值为 SIG_IGN(表示忽略该信号) 或 SIG_DFL(采用默认的处理行为)。

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

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

    • SA_RESTART 使被信号打断的系统调用自动重新发起。
    • SA_NODEFER 使对信号的屏蔽无效,即在信号处理函数执行期间仍能发出这个信号。
    • SA_ONSTACK 针对此信号调用处理器函数时,使用了由 sigaltstack() 安装的备选栈。
    • SA_NOCLDSTOP 使父进程在它的子进程暂停或继续运行时不会收到 SIGCHLD 信号。
    • SA_NOCLDWAIT 使父进程在它的子进程退出时不会收到 SIGCHLD 信号,这时子进程如果退出也不会成为僵尸进程。
    • SA_RESETHAND 信号处理之后重新设置为默认的处理方式。
    • SA_SIGINFO 使用 sa_sigaction 成员而不是 sa_handler 作为信号处理函数。
  • sa_sigaction
    信号处理函数的地址,当 sa_flags 成员的值包含了 SA_SIGINFO 标志时,系统将使用 sa_sigaction 函数作为信号处理函数获得关于信号的更详细的信息,否则使用 sa_handler 作为信号处理函数。

1.3 返回值

  • 0
    函数执行成功
  • -1
    函数执行失败

参考