sigaction 的使用

时间:2023-01-31 11:07:50

linux内核会发射一些信号,应用程序可以捕捉信号执行特定函数

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);  成功:;失败:-,设置errno

act:传入参数,新的处理方式。oldact:传出参数,旧的处理方式。

struct sigaction结构体

    struct sigaction {

      void(*sa_handler)(int);
  sigset_t sa_mask;   int sa_flags;
};

① sa_handler:指定信号捕捉后的处理函数名(即注册函数)。也可赋值为SIG_IGN表忽略 或 SIG_DFL表执行默认动作

② sa_mask: 调用信号回调函数时,所要屏蔽的信号集合(信号屏蔽字)。注意:仅在处理函数被调用期间屏蔽生效,是临时性设置。用sigaddset函数添加需要被捕捉的信号。

③ sa_flags:通常设置为0,表使用默认属性:为0的时候,可以屏蔽正在处理的信号(若在处理2号信号时又有2号信号,则此时传来的2号信号会被屏蔽)。

#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
void func(int signal)
{
printf("%d号信号被捕捉。\n", signal);
} int main(void)
{ struct sigaction act, oldact; act.sa_handler = func; act.sa_flags = ; sigemptyset(&act.sa_mask);//sa_mask是一个临时信号集,将其清零(初始化I) sigaddset(&act.sa_mask, SIGQUIT);//将3号信号添加到信号集,即:3号信号就是我们在处理2号信号的时候需要屏蔽的那个信号,也可以添加其他信号,比如20号信号 sigaddset(&act.sa_mask, SIGTSTP); int s_ret = sigaction(SIGINT, &act, &oldact); if (>s_ret)
{
perror("sigaction error"); exit();
} while (); return ; }