关闭

捉拿信号的alarm和pause函数

标签: signal
238人阅读 评论(0) 收藏 举报
分类:

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:175730次
    • 积分:2223
    • 等级:
    • 排名:第17568名
    • 原创:41篇
    • 转载:73篇
    • 译文:2篇
    • 评论:9条
    文章分类
    最新评论