2022-1-23 牛客C++ 项目 —— signal 函数

/*
 #include <signal.h>

       typedef void (*sighandler_t)(int);

       sighandler_t signal(int signum, sighandler_t handler);
        -功能:设置捕捉某个信号的处理行为
        (话说和 C++、Java 当中的捕捉异常并处理真的好像
        -参数:要捕捉的信号
        -handler 捕捉到的信号应该如何处理
            -SIG_IGN:忽略捕捉到的信号,跟没产生信号一样
            -SIG_DFL:执行信号的默认行为,跟没捕捉信号一样
            -回调函数:由内核去调用,程序员只负责写,如何去处理这个信号
            需要程序员自行提前写好,函数的类型根据实际需求。看函数指针的定义
            不是程序员调用,当信号产生,由内核(框架)调用。
            函数指针是实现回调的手段。只要将写好的函数名,放入函数指针的位置便可

        -返回值:
        成功,返回上一次注册的信号处理函数的地址(上一次调用该函数提供的解决方案的地址)
        失败:返回SIG_ERR ,并且设置 erron
       SIGKILL SIGSTOP 不能被捕捉,也不能被忽略
       
*/
#include<sys/time.h>
#include<stdio.h>
#include<stdlib.h>
#include <signal.h>
//过 3 秒后,每隔两秒钟定时一次

int main(void){
    //注册信号捕捉
    //(必须得先写好,否则等信号来了就来不及了,和捕捉小动物需要设立陷阱是一个道理)
    signal(SIGALRM,SIG_IGN);
    //使用 SIG_IGN 像没有产生信号一样,程序不会挂

    struct itimerval new_value;
    //设置值
    //设置每隔2秒
    new_value.it_interval.tv_sec = 2;
    new_value.it_interval.tv_usec = 0;
    //总的时间是 sec + usec

    //设置延迟的时间
    new_value.it_value.tv_sec = 3;
    new_value.it_value.tv_usec = 0;

    int ret = setitimer(ITIMER_REAL,&new_value,NULL);
    //是非阻塞的
    printf("clock is starting.\n");
    //如果需要让这个定时器循环的发挥作用,程序需要能够捕捉这个定时器发送的信号
    //并且做出相应的对应的行动。
    //就像人在自己有情绪的时候,需要对自己的情绪和行为重定向
    if(ret == -1){
        perror("setitimer");
        exit(0);
    }

    getchar();
}

使用 SIG_IGN 作为信号处理方式的结果
在这里插入图片描述
使用 SIG_DFL 作为信号处理的结果

在这里插入图片描述

自定义捕捉信号的函数

#include<sys/time.h>
#include<stdio.h>
#include<stdlib.h>
#include <signal.h>
//过 3 秒后,每隔两秒钟定时一次
void myalarm(int sig){
    printf("捕捉到的信号的编号是 %d 。\n",sig);
    printf("XXXXXXXXX");
}
int main(void){
    //注册信号捕捉
    //(必须得先写好,否则等信号来了就来不及了,和捕捉小动物需要设立陷阱是一个道理)
    //signal(SIGALRM,SIG_IGN);
    //使用 SIG_IGN 像没有产生信号一样,程序不会挂
    //signal(SIGALRM,SIG_DFL);
    signal(SIGALRM,myalarm);
    struct itimerval new_value;
    //设置值
    //设置每隔2秒
    new_value.it_interval.tv_sec = 2;
    new_value.it_interval.tv_usec = 0;
    //总的时间是 sec + usec

    //设置延迟的时间
    new_value.it_value.tv_sec = 3;
    new_value.it_value.tv_usec = 0;

    int ret = setitimer(ITIMER_REAL,&new_value,NULL);
    //是非阻塞的
    printf("clock is starting.\n");
    //如果需要让这个定时器循环的发挥作用,程序需要能够捕捉这个定时器发送的信号
    //并且做出相应的对应的行动。
    //就像人在自己有情绪的时候,需要对自己的情绪和行为重定向
    if(ret == -1){
        perror("setitimer");
        exit(0);
    }

    getchar();
}

运行结果
在这里插入图片描述

补充内容:函数指针

1、什么是函数指针?
函数在内存中会有一块地址,指向那个分配地址的空间的指针就是函数指针。

2、如何定义一个函数指针?
函数返回值 (*函数指针名)(函数参数列表)

3、函数指针的注意事项有哪些?
1)函数指针名 和 * 号一定要加括号,否则是函数定义,定义一个返回类型为指针的函数。
2)函数指针没有 ++ 和 – 的运算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值