Linux 改进捕捉信号机制

Posted 庖丁解牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 改进捕捉信号机制相关的知识,希望对你有一定的参考价值。

sigaction函数
sigaction函数的功能是检查或修改与指定信号相关联的处理动作,该函数取代了signal函数。
因为signal函数在信号未决时接收信号可能出现问题,所以使用sigaction更安全。
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
成功返回0,失败返回-1。
参数signum是要检测或者修改其具体动作的信号编号(或同事执行这两种操作)。
如果act指针非空,则要修改其动作,
如果oact指针非空,则系统由oact指针返回该信号的上一个动作。
一般我们对信号的上一个动作并不太关心,第三个参数可以传0
struct sigaction {
    void     (*sa_handler)(int);
    void     (*sa_sigaction)(int, siginfo_t *, void *);
    sigset_t   sa_mask;
    int        sa_flags;
    void     (*sa_restorer)(void);
};

 

//捕捉信号
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>

void catch_signal(int sign)
{
    switch(sign)
    {
    case SIGINT:
        //SIGINT默认行为是退出进程
        printf("SIGINT signal\n");
        exit(0);
        break;
    case SIGALRM:
        //SIGALRM默认行为是退出进程
        printf("SIGALRM signal\n");
        break;
    case SIGKILL:
        printf("SIGKILL signal\n");
        break;
    }
}

//建议使用封装之后的mysignal
int mysignal(int sign,void (*func)(int))
{
    struct sigaction act,oact;
    //传入回调函数
    act.sa_handler=func;
    //将act的属性sa_mask设置一个初始值
    sigemptyset(&act.sa_mask);
    act.sa_flags=0;
    return sigaction(sign,&act,&oact);
}

int main(int arg, char *args[])
{
    mysignal(SIGINT,catch_signal);
    mysignal(SIGALRM,catch_signal);
    mysignal(SIGKILL,catch_signal);
    int i=0;
    while(1)
    {
        printf("hello god  %d\n",i++);
        sleep(1);
    }
    return 0;
}

 

以上是关于Linux 改进捕捉信号机制的主要内容,如果未能解决你的问题,请参考以下文章

linux学习:信号初识

Linux:详解进程信号(信号的捕捉流程,信号的阻塞volatile关键字)

Linux----信号

Linux trap(捕捉) 命令

Linux 信号捕捉

Linux 信号