Linux C/C++信号3

35 篇文章 0 订阅
35 篇文章 0 订阅


一、signal和sigaction信号捕捉函数

sighandler_t signal(int signum, sighandler_t handler);

其功能为设置某个信号的捕捉行为
参数signum为要捕捉的信号,handler为捕捉到信号要如何处理
SIG_IGN:忽略信号
SIG_DEF:使用信号默认的行为
指定函数地址:信号捕捉函数
返回值
成功:返回上一次注册的信号处理函数的地址。第一次调用NULL。
失败:返回SIG_ERR,设置错误号


int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

其功能为:检查或改变信号的处理。信号捕捉。
参数signum为需要捕捉信号的编号或者宏值(信号的名称),act为捕捉到信号之后的处理动作,oldact为上一次对信号捕捉相关的设置,一般不使用,传递NULL.
返回值
成功:0
失败:-1

struct sigaction {
            //函数指针,指向的函数就是信号捕捉到之后的处理函数
            void     (*sa_handler)(int);
            //不常用
            void     (*sa_sigaction)(int, siginfo_t *, void *);
            //临时阻塞信号集,在信号捕捉函数执行过程中,临时阻塞某些信号
            sigset_t   sa_mask;
            //使用那一个信号处理对捕捉到的信号进行处理
            //这个值可以是0,表示sa_handler,也可以是SA_SIGINFO表示使用sa_sigaction
            int        sa_flags;
            //被废弃了
            void     (*sa_restorer)(void);
        };

二、signal使用

#include<stdio.h>
#include<stdlib.h>
#include <sys/time.h>
#include <signal.h>

void myalarm(int num)
{
    printf("捕捉到了信号的编号是:%d\n",num);
    printf("xxxxxx\n");
}

//过三秒以后,每隔2秒定时一次
int main()
{
    //注册信号捕捉
    //signal(SIGALRM,SIG_IGN);
    //signal(SIGALRM,SIG_DFL);
    //void (*sighandler_t)(int);函数指针,int类型参数表示捕捉到信号的值
    signal(SIGALRM,myalarm);

    

    struct itimerval new_value;

    //设置间隔的时间
    new_value.it_interval.tv_sec=2;
    new_value.it_interval.tv_usec=0;

    //设置延迟的时间,3秒之后开始第一次定时
    new_value.it_value.tv_sec=3;
    new_value.it_value.tv_usec=0;


    int ret = setitimer(ITIMER_REAL,&new_value,NULL);//非阻塞
    printf("定时器开始了。。。\n");

    if(ret==-1)
    {
        perror("setitimer");
        exit(0);
    }

    getchar();

    return 0;
}

三、sigaction使用

#include<stdio.h>
#include<stdlib.h>
#include <sys/time.h>
#include <signal.h>

void myalarm(int num)
{
    printf("捕捉到了信号的编号是:%d\n",num);
    printf("xxxxxx\n");
}

//过三秒以后,每隔2秒定时一次
int main()
{
    struct sigaction act;
    act.sa_flags=0;
    act.sa_handler=myalarm;
    sigemptyset(&act.sa_mask);//设置临时阻塞信号集

    //注册信号捕捉
    sigaction(SIGALRM,&act,NULL);

    struct itimerval new_value;

    //设置间隔的时间
    new_value.it_interval.tv_sec=2;
    new_value.it_interval.tv_usec=0;

    //设置延迟的时间,3秒之后开始第一次定时
    new_value.it_value.tv_sec=3;
    new_value.it_value.tv_usec=0;


    int ret = setitimer(ITIMER_REAL,&new_value,NULL);//非阻塞
    printf("定时器开始了。。。\n");

    if(ret==-1)
    {
        perror("setitimer");
        exit(0);
    }

    //getchar();
    while(1);

    return 0;
}

总结

今天,我介绍了signal和sigaction信号捕捉函数,其功能类似,区别是sigaction可以设置非阻塞。推荐使用sigaction函数,signal函数不兼容许多操作系统。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值