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
...
...