Linux Signal (7): 捕获信号的alarm和pause函数

1. alarm函数:

alarm也称为闹钟函数,一个进程只能有一个闹钟时间,如果在调用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才返回.


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dai_weitao/archive/2007/09/25/1799640.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值