Linux多进程16-signal 信号捕捉函数

#include <signal.h>
typedef void (*sighandler_t)(int); 函数指针, int 类型的参数表示捕捉到的信号的值
sighandler_t signal(int signum, sighandler_t handler);
    - 功能: 设置某个信号的捕捉行为
    - 参数:
        - signum: 要捕捉的信号, 一般使用宏值
        - handler: 捕捉到的信号要如何处理
            - SIG_IGN: 忽略信号
            - SIG_DFL: 使用信号默认的行为
            - 回调函数: 当信号产生, 由内核去调用, 程序员只负责写, 捕捉到信号后如何处理信号.
    - 返回值:
            成功返回前一次注册信号处理函数的地址. 第一次调用返回NULL
            失败返回SIG_ERR, 设置错误号

SIGKILL SIGSTOP 不能被捕捉, 不能被忽略

示例代码

#include <stdio.h>
#include <sys/time.h>
#include <stdlib.h>
#include <sys/signal.h>
//过3S后, 每隔2S定时一次

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

int main(int argc, char const *argv[])
{

    //注册信号捕捉
    // signal(SIGALRM, SIG_IGN); //忽略信号, 啥都不做, 程序不自动终止
    // signal(SIGALRM, SIG_DFL); //和原来一样, 相当于啥都没有设置

    //指定回调函数
    signal(SIGALRM, myalarm);

    struct itimerval new_value;
    //设置间隔时间
    new_value.it_interval.tv_sec = 2;
    new_value.it_interval.tv_usec = 0;
    //设置延迟时间, 3S后开始第一次定时
    new_value.it_value.tv_sec = 3;
    new_value.it_value.tv_usec = 0;

    int ret = setitimer(ITIMER_REAL, &new_value, NULL);
    if (ret == -1)
    {
        perror("setitimer err");
        exit(0);
    }
    printf("定时器开始了...\n");

    getchar();

    return 0;
}

运行程序

./signal 
定时器开始了...
# 间隔3S
捕捉到了信号的编号是: 14
xxxxxxx
# 间隔2S
捕捉到了信号的编号是: 14
xxxxxxx
# 间隔2S
捕捉到了信号的编号是: 14
xxxxxxx
# 间隔2S
捕捉到了信号的编号是: 14
xxxxxxx
...
...

本文作者:言叶以上

本文链接:https://www.cnblogs.com/anqwjoe/p/17409747.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   言叶以上  阅读(68)  评论(0编辑  收藏  举报
历史上的今天:
2018-05-17 Vue.js 基础知识
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起