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