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

Linux Signal (4): alarm和pause

2013-12-25 21:10 253 查看
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才返回.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: