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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2018-05-17 Vue.js 基础知识