Linux C系统编程:信号与定时器的使用

时间:2021-11-27 04:22:37
#include <stdio.h>
#include <signal.h>


void do_alarm(int num);

int main(void)
{
//注册一个定时器


if(signal(SIGALRM , do_alarm) == SIG_ERR)
{
perror("register alarm fail");
return -1;
}

//alarm
////3秒之后发送SIGALRM信号,但是一次性的 SIGALRM信号:定时器的信号
alarm(3);

while(1)
{
printf("this is in main... \n");
sleep(3);
}

return 0 ;
}

void do_alarm(int num)
{
printf("this is in alarm ... &*&&\n");
//会影响sleep
alarm(1);
}

执行结果:

this is in main... 
this is in alarm ... &*&&
this is in main... 
this is in alarm ... &*&&
this is in main... 
this is in alarm ... &*&&
this is in main... 

......

在<signal.h> 这个头文件中。signal(参数1,参数2);参数1:我们要进行处理的信号。系统的信号我们可以再终端键入 kill -l查看(共64个)。其实这些信号时系统定义的宏。参数2:我们处理的方式(是系统默认还是忽略还是捕获),这里我写了一个处理函数,也就是说这里不是系统默认的。unsigned int alarm(unsigned int seconds);参数1:表示指定的秒数。要注意的是,一个进程只能有一个闹钟时间,如果在调用alarm之前已设置过闹钟时间,则任何以前的闹钟时间都被新值所代替。需要注意的是,经过指定的秒数后,信号由内核产生,由于进程调度的延迟,所以进程得到控制从而能够处理该信号还需要一些时间。如果有以前为进程登记的尚未超时的闹钟时钟,而且本次调用的seconds值是0,则取消以前的闹钟时钟,其余留值仍作为alarm函数的返回值。以上程序是利用定时器产生的一个信号SIGALRM信号,在收到该信号同时会调用do_alarm函数。这也就类似单片机的定时中断,当定时到了,就跳到中断服务函数里去执行相应的程序。