您的位置:首页 > 运维架构 > Linux

Linux Signal (4): alarm和pause

2007-09-25 11:21 393 查看
1. alarm函数:
alarm函数是设置一个计时器, 在计时器超时的时候, 产生SIGALRM信号. 如果不忽略或捕捉此信号, 它的默认操作是终止调用该alarm函数的进程.
原型如下:


#include <unistd.h>




unsigned int alarm(unsigned int seconds);




返回0或余留秒数

说一下alarm的返回值问题, 每个进程只能有一个alarm维护的"闹钟".
如果该"闹钟"顺利超时, 则返回0;
如果该"闹钟"在计时过程中, 调用了另一个alarm函数, 则该"闹钟"的余留秒数作为该次alarm的返回值, 并且新的"闹钟"开始计时.(实际上是新的闹钟替代了以前的闹钟)
代码举例:

#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 ", nsec);
return alarm(nsec);
}

/* My sleep func for print */
static unsigned int my_sleep(unsigned int nsec)
{
printf("Sleep for %u secs ", nsec);
return sleep(nsec);
}

/* SIGALRM handler */
static void sig_alarm(int signo)
{
printf("SIGALRM ");
}

int main()
{
/* Check alarm return value */
unsigned int ret1, ret2;

/* Signal handle */
if (signal(SIGALRM, sig_alarm) < 0)
perror("signal");

printf("Alarm start: ");

/* First alarm */
ret1 = my_alarm(5);
my_sleep(3);

printf("New alarm: ");

/* Second alarm */
ret2 = my_alarm(2);
my_sleep(4);

printf("Alarm end ");

/* Show the two return values */
printf("First return: %u ", ret1);
printf("Second return: %u ", ret2);

return 0;
}

这段代码中我自己封装了my_alarm和my_sleep, 在其中添加了printf的代码用于跟踪.
程序的运行结果如下:

Alarm start:
Wait for 5 secs to alarm
Sleep for 3 secs
New alarm:
Wait for 2 secs to alarm
Sleep for 4 secs
SIGALRM
Alarm end
First return: 0
Second return: 2

由上面这个结果, 我想我对这个程序就不用多解释了.

由此可见alarm的返回值问题, 一目了然.

2. pause函数:
pause函数使调用进程挂起, 直到捕捉到一个信号. 它的原型如下:

#include <unistd.h>

int pause();

返回-1, 并将errno设置为EINTR.

这个函数很简单, 由字面意思就可以理解出来"暂停". pause只有在执行了一个信号处理程序并从其返回时, pause才返回.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: