alarm函数详解

alarm函数的解析网上有很多博客,但是我觉得都写得很模糊,现在我自己运行了程序,终于搞明白了。

原型如下:

#include

unsigned int alarm(unsigned int seconds);/*指定秒数*/

alarm函数是设置一个计时器, 在计时器超时的时候, 产生SIGALRM信号. alarm也称为闹钟函数,一个进程只能有一个闹钟时间。如果不忽略或捕捉此信号, 它的默认操作是终止调用该alarm函数的进程。

它的主要功能是设置信号传送闹钟。其主要功能用来设置信号SIGALRM在经过seconds指定的秒数后传送给目前的进程,如果在定时未完成的时间内再次调用了alarm函数,则后一次定时器设置将覆盖前面的设置,当seconds设置为0时,定时器将被取消。它返回上次定时器剩余时间,如果是第一次设置则返回0。

那么上面这句话要怎么理解呢?怎么个代替发呢????是这样的,先看一个程序,让事实说话:

#include
#include
#include
/*  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

你可能感兴趣的:(APUE)