zl程序教程

您现在的位置是:首页 >  后端

当前栏目

进程间信号的接收和处理 ------ sigaction 的使用

进程 处理 信号 接收 ------ 使用
2023-09-11 14:19:53 时间

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

 

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);  成功:0;失败:-1,设置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 = 0;

    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 (0>s_ret)
    {
        perror("sigaction error");

        exit(1);
    }

    while (1);

    return 0;

}