参考网络资料,仅作学习。
说明:
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 ...
......