捉拿信号的alarm和pause函数

转载 2012年03月28日 10:41:24

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才返回.

使用alarm和pause实现sleep的初级认识

又有一段时间没写了。。 今天看到一句话,“sleep函数在底层是用alarm和pause实现的”,就上网搜了一下,看了好一会儿才明白是怎么回事。 alarm函数其实就是个定时器,每个进程只能维护一...
  • u012792219
  • u012792219
  • 2014年03月28日 14:30
  • 1401

Linux环境编程之信号处理(三、利用alarm()和pause()函数实现sleep()函数)

sleep()是执行挂起一段时间,而alarm()函数是定时器,pause()函数则是挂起进程,当出现信号打断时,才会继续往前执行;         先来分享下alarm()函数,alarm()函数用...
  • YuZhiHui_No1
  • YuZhiHui_No1
  • 2015年04月03日 14:51
  • 1935

alarm pause 的用法

alarm()和pause()函数的应用 alarm unsigned int alarm(unsigned int seconds); alarm函数是设置一个计时器, 在计时器超时的时候, ...
  • sgling0440
  • sgling0440
  • 2011年08月07日 16:19
  • 1547

Linux c 中alarm,signal,pause的使用说明

直接看代码 #include #include #include void myfunc() { printf("myfunc\n"); exit(0); //...
  • Leeboy_Wang
  • Leeboy_Wang
  • 2012年03月30日 16:40
  • 4674

linux 信号 alarm和pause

unsigned int alarm(unsigned int seconds);     该函数在执行seconds秒之后产生SIGALRM信号,如果忽略或不捕捉这个信号将终止其调用进程。   ...
  • u013378057
  • u013378057
  • 2016年02月09日 09:44
  • 127

Linux c 信号—pause、sigsuspend 的相同于区别

Linux c 信号—pause、sigsuspend 的相同于区别 分类: Linux进程管理2013-08-12 16:16 358人阅读 评论(0) 收藏 举报 Linux ...
  • pi9nc
  • pi9nc
  • 2014年05月02日 11:11
  • 2097

10.10 信号_alarm和pause函数

    使用alarm函数可以设置一个计时器,在将来某个指定的时间该计时器会超时。当计时器超时时,产生SIGALRM信号。如果不忽略或不捕捉此信号,则其默认动作是终止调用该alarm函数的进程。#in...
  • cxf100900
  • cxf100900
  • 2010年07月21日 17:59
  • 571

alarm和pause函数

《朱老师物联网大讲堂》学习笔记           学习地址:www.zhulaoshi.org
  • qq_18973645
  • qq_18973645
  • 2016年09月27日 22:18
  • 60

Linux 2.6 Alarm信号中断遇上函数阻塞

Unix网络编程 中提到,可以使用alarm + signal 机制产生信号,从而使程序从阻塞的函数调用中跳出,例子如下: 服务进程使用阻塞的监听套接字进入监听,设置3s的alarm,确保3s内无客户...
  • ordeder
  • ordeder
  • 2014年03月25日 21:27
  • 2719

定时器alarm函数

alarm也称为闹钟函数,它可以在进程中设置一个定时器,当定时器指定的时间到时,它向进程发送SIGALRM信号。可以设置忽略或者不捕获此信号,如果采用默认方式其动作是终止调用该alarm函数的进程(源...
  • Janskid
  • Janskid
  • 2017年08月14日 20:44
  • 164
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:捉拿信号的alarm和pause函数
举报原因:
原因补充:

(最多只允许输入30个字)