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
...
...
posted @ 2023-05-17 18:41  言叶以上  阅读(53)  评论(0编辑  收藏  举报