alarm函数的解析网上有很多博客,但是我觉得都写得很模糊,现在我自己运行了程序,终于搞明白了。
原型如下:
#include <unistd.h>
unsigned int alarm(unsigned int seconds);/*指定秒数*/
alarm函数是设置一个计时器, 在计时器超时的时候, 产生SIGALRM信号. alarm也称为闹钟函数,一个进程只能有一个闹钟时间。如果不忽略或捕捉此信号, 它的默认操作是终止调用该alarm函数的进程。
它的主要功能是设置信号传送闹钟。其主要功能用来设置信号SIGALRM在经过seconds指定的秒数后传送给目前的进程,如果在定时未完成的时间内再次调用了alarm函数,则后一次定时器设置将覆盖前面的设置,当seconds设置为0时,定时器将被取消。它返回上次定时器剩余时间,如果是第一次设置则返回0。
那么上面这句话要怎么理解呢?怎么个代替发呢????是这样的,先看一个程序,让事实说话:
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
/* My alarm func for print */
static unsigned int my_alarm(unsigned int nsec)
{
printf("Wait for %u secs to alarm\n", nsec);
return alarm(nsec);
}
/* My sleep func for print */
static unsigned int my_sleep(unsigned int nsec)
{
printf("Sleep for %u secs\n ", nsec);
return sleep(nsec);
}
/* SIGALRM handler */
static void sig_alarm(int signo)
{
printf("SIGALRM\n");
}
int main()
{
/* Check alarm return value */
unsigned int ret1, ret2, ret3;
/* Signal handle */
if (signal(SIGALRM, sig_alarm) < 0)
perror("signal");
printf("Alarm start:\n");
/* First alarm */
ret1 = my_alarm(6);
my_sleep(6);
printf("New alarm:\n");
/* Second alarm */
ret2 = my_alarm(2);
my_sleep(1);
/* Third alarm */
ret3 = my_alarm(1);
my_sleep(2);
printf("Alarm end\n");
/* Show the two return values */
printf("First return: %u\n", ret1);
printf("Second return: %u\n", ret2);
printf("Third return: %u\n", ret3);
return 0;
}
首先ret它返回上次定时器剩余时间,如果是第一次设置则返回0,不管sleep了几秒。然而第二次的ret是上一次定时器的剩余值,如果上一次sleep了3秒,则剩余值就是3(6-3=3),如果sleep了6秒,则剩余值是0,而且第二次的alarm函数的seconds会替代第一次的alarm 的seconds,第三次也是一样的,当第二次seconds为2,sleep了1秒,则剩余秒数1就作为ret3的值。所以运行结果如下:
[lingyun@localhost apue]$ ./alarm
Alarm start:
Wait for 6 secs to alarm
Sleep for 6 secs //sleep了6秒,产生了SIGALARM信号;
SIGALRM
New alarm:
Wait for 2 secs to alarm
Sleep for 1 secs
Wait for 1 secs to alarm
Sleep for 2 secs
SIGALRM
Alarm end
First return: 0
Second return: 0
Third return: 1
[lingyun@localhost apue]$ ./alarm
Alarm start:
Wait for 6 secs to alarm
Sleep for 3 secs //sleep了3秒
New alarm:
Wait for 2 secs to alarm
Sleep for 1 secs
Wait for 1 secs to alarm
Sleep for 2 secs
SIGALRM
Alarm end
First return: 0
Second return: 3
Third return: 1