参考网络资料,仅作学习。
说明:
alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。
若参数seconds为0,则之前设置的闹钟会被取消,并将剩下的时间返回。
一个进程只能有一个闹钟时间,如果在调用alarm之前已经设置过闹钟时间,则任何以前的闹钟时间都会被新值所代替。
头文件:
#include <unistd.h>
函数原型:
unsigned int alarm(unsigned int seconds);
函数返回值:
成功:如果调用此alarm前,进程已经设置了闹钟,则返回上一个闹钟剩下的时间,否则返回0;
失败:-1
范例一 单一闹钟:
#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <signal.h> #define SLEEP_TIME 6 int time_out = 0; void handler() { printf("Wake up!\n"); time_out = 1; } int main() { int i; signal(SIGALRM, handler); //让内核做好准备,一旦接受到SIGALARM信号,就执行 handler alarm(SLEEP_TIME);//设置闹钟,准备睡觉 printf("Alarm setted!\n"); for(i = 1;!time_out; i++) { printf("sleep %d ...\n",i); sleep(1); } return 0; }
运行结果:
$ ./access
Alarm setted!
sleep 1 ...
sleep 2 ...
sleep 3 ...
sleep 4 ...
sleep 5 ...
sleep 6 ...
Wake up!
范例二 多个闹钟:
#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <signal.h> #define SLEEP_TIME 6 int time_out = 0; void handler() { printf("Wake up!\n"); time_out = 1; } int main() { int i; signal(SIGALRM, handler); printf("Alarm 1 setted! Ret is %d\n",alarm(SLEEP_TIME)); sleep(2); printf("Alarm 2 setted! Ret is %d\n",alarm(SLEEP_TIME)); for(i = 1;!time_out; i++) { printf("sleep %d ...\n",i); sleep(1); } return 0; }
运行结果:
$ ./access
Alarm 1 setted! Ret is 0
Alarm 2 setted! Ret is 4
sleep 1 ...
sleep 2 ...
sleep 3 ...
sleep 4 ...
sleep 5 ...
sleep 6 ...
sleep 7 ...
Wake up!
范例三 第二闹钟设置为0
#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <signal.h> #define SLEEP_TIME 6 int time_out = 0; void handler() { printf("Wake up!\n"); time_out = 1; } int main() { int i; signal(SIGALRM, handler); printf("Alarm 1 setted! Ret is %d\n",alarm(SLEEP_TIME)); sleep(2); printf("Alarm 2 setted! Ret is %d\n",alarm(0)); for(i = 1;!time_out; i++) { printf("sleep %d ...\n",i); sleep(1); } return 0; }
运行结果:闹钟被取消,handler不会被执行。
$ ./access
Alarm 1 setted! Ret is 0
Alarm 2 setted! Ret is 4
sleep 1 ...
sleep 2 ...
sleep 3 ...
sleep 4 ...
sleep 5 ...
sleep 6 ...
sleep 7 ...
sleep 8 ...
sleep 9 ...
sleep 10 ...
sleep 11 ...
sleep 12 ...
sleep 13 ...
sleep 14 ...
sleep 15 ...
......