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