Linux Signal (4): alarm和pause

原创 2007年09月25日 11:21:00

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

 

一个低级Illegal instruction错误的定位--忽略编译期警告就得加倍偿还

这个问题是我在开发心跳服务器时的一个笔误,其实错误非常的低级浅显,特别写篇文章是想告诉大家,编译期的警告是非常重要的!由于项目代码量大,编译期信息很多,我在忙于联调时就悲催的忽视了一条编译期警告信息,...
  • russell_tao
  • russell_tao
  • 2013年06月25日 17:19
  • 30247

[原]NDK程序在虚拟机上运行出现signal 4 (SIGILL), fault addr 错误的原因及解决方法

终于到了移植的最后一步 ,但是编译出来的SO文件加入工程后在虚拟机上总是无法执行,查看DDMS发现报错03-14 10:43:08.623: INFO/DEBUG(28): signal 4 (SIG...
  • sweetrryy
  • sweetrryy
  • 2011年03月14日 20:32
  • 6973

[手机平台]Alarm事件管理器设计备忘录

[手机平台]Alarm事件管理器设计备忘录 转载时请注明出处:http://blog.csdn.net/absurd 这里的Alarm是指定时提醒相关的Alarm事件。在智能手机里,个人信息管理(PI...
  • absurd
  • absurd
  • 2006年09月19日 22:33
  • 2905

关于Linux 下kill 与 pause的一些小思考

这次操作系统上机课,在写两个子进程间依照先后次序输出两条命令的程序时,发现了一些小问题,在此记下以备忘。 #include #include #include #include #i...
  • ssdut_209
  • ssdut_209
  • 2016年04月02日 09:55
  • 829

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

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

linux signal 列表

Linux 信号表 Linux支持POSIX标准信号和实时信号。下面给出Linux Signal的简表,详细细节可以查看man 7 signal。 默认动作的含义如下:Term    终止进程 信号取...
  • wesleyluo
  • wesleyluo
  • 2010年02月02日 09:46
  • 16670

Linux signal 那些事儿(4)信号的deliver顺序

signal
  • Fybon
  • Fybon
  • 2017年03月29日 17:06
  • 506

Linux 信号signal处理机制、定时器

信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。  信号机制是进程之间相互传递消息的一种方法...
  • mysee1989
  • mysee1989
  • 2014年04月15日 11:15
  • 755

为什么使用sigaction而非signal

所以希望能用相同方式处理信号的多次出现,最好用sigaction.信号只出现并处理一次,可以用signal.   signal函数每次设置具体的信号处理函数(非SIG_IGN)只能生效一次,每次在...
  • suifengpiao_2011
  • suifengpiao_2011
  • 2016年07月06日 12:15
  • 854

Linux进程之alarm()信号传送闹钟函数

最近在学习Linux系统编程遇到了一个很有意思的函数:alarm(),它是一个用来设置信号传送的闹钟函数。网上找了一些资料,结合自己的学习体会,现在Mark一下。 1 alarm()函数说明 [1...
  • ken_lyy
  • ken_lyy
  • 2016年05月04日 09:57
  • 1413
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux Signal (4): alarm和pause
举报原因:
原因补充:

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