捉拿信号的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才返回.

相关文章推荐

UNIX环境高级编程——信号之kill、raise、killpg、alarm、pause、abort、sleep、usleep、nanosleep和setitimer函数

一、kill, raise, killpg 函数int kill(pid_t pid, int sig);int raise(int sig);int killpg(int pgrp, int sig...

信号的发送和捕捉函数(alarm、kill、raise、pause、 sleep、abort)

1.   alarm函数(1) alarm函数原型             alarm(设置信号传送闹钟)所需头文件#include #include 函数说明alarm()用来设置信号SIGALRM...

apue-alarm和pause函数,关于信号

题记: 这里主要是用alarm和pause来实现sleep函数。会分析其中存在的bug,会很精辟。当然,大牛的恩赐啦~~不然我介些小生怎看到如此的经典呢?! 1实现sleep 1...
  • wusoule
  • wusoule
  • 2013年04月16日 14:58
  • 883

linux进程通信---几个发送信号的函数(kill,raise,alarm,pause)

信号:信号是unix中最古老的进程通信的一种方式,他是软件层次上对中断机制的模拟,是一种异步通信方式,信号可以实现用户空间进程和内核空间进程的交互,内核进程可以利用他通知用户空间进程发生了哪些系统事件...

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

sleep()是执行挂起一段时间,而alarm()函数是定时器,pause()函数则是挂起进程,当出现信号打断时,才会继续往前执行;         先来分享下alarm()函数,alarm()函数用...

[Linux C编程]信号发送捕捉kill() raise() alarm() pause()

信号概述 ● 信号是在软件层次上对中断机制的一种模拟。在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。 ● 信号是异步的,一个进程不必通过任何操作来等待信号的到达...

Linux进程间通信(四)---信号通信之信号发送捕捉kill()、raise()、alarm()、pause()及其基础实验

信号概述    ●  信号是在软件层次上对中断机制的一种模拟。在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。    ●  信号是异步的,一个进程不必通过任何操作来等待信号的...

(笔记)alarm、pause、sleep函数的使用

一、函数简介 1 alarm() 头文件:#include 函数:unsigned int alarm(unsigned int seconds); 函数说明:alarm()用来设置信号SIGAL...

alarm和pause函数

NOTE:部分文字说明出自《UNIX环境高级编程》 1. alarm函数        每个进程只能有一个闹钟时钟。如果在调用alarm时,以前已为该进程设置过时钟,而且它还没超时,则将该闹钟...
  • elbort
  • elbort
  • 2012年05月23日 12:24
  • 321

利用函数alarm和pause模拟sleep

1. 简单介绍sig alarm(unsigned int alam)当在调用alarm()前已经设置了一个闹钟,那么我们可以调用alarm(0)来取消此闹钟,并返回剩余时间 2. int pause...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:捉拿信号的alarm和pause函数
举报原因:
原因补充:

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