alarm和pause函数

NOTE:部分文字说明出自《UNIX环境高级编程》

1. alarm函数

       每个进程只能有一个闹钟时钟。如果在调用alarm时,以前已为该进程设置过时钟,而且它还没超时,则将该闹钟的余值作为本次alarm函数调用的值返回。以前登记的时钟则被新值代替。如果闹钟到时,默认操作为终止该进程,但是大多数进程会捕捉该信号然后进行相应的处理。

代码说明1:

#include "unistd.h"
#include "stdio.h"

int main()
{
        int ret = 0;
        int alarm_num = 10,sleep_num = 3;

        printf("Begin to first count alarm %d seconds.\n",alarm_num);
        ret = alarm(alarm_num);
        printf("Begin to sleep count %d seconds.\n",sleep_num);
        sleep(sleep_num);
        printf("End sleep,first_ret = %d\n",ret);
        alarm_num = 2;                                     
        printf("Begin to second count alarm %d seconds.\n",alarm_num);
        ret = alarm(alarm_num);                 //重新赋值给闹钟2秒
        printf("second ret = %d\n",ret);
        while(1);
        return 0;
}

编译:

[elbort@elbort test1]$ gcc -Wall -o test test.c

结果显示:

[elbort@elbort test1]$ ./test
Begin to first count alarm 10 seconds.
Begin to sleep count 3 seconds.
End sleep,first_ret = 0
Begin to second count alarm 2 seconds.
second ret = 7                                    //重新给闹钟赋值前,闹钟运行了3秒,所以返回值为10-3=7。

注意:这里等了两秒
闹钟                                                      //闹钟到时,默认终止该进程
[elbort@elbort test1]$ 


代码说明2:添加对闹钟信号处理

#include "unistd.h"
#include "stdio.h"
#include "signal.h"
#include "stdlib.h"
void sig_alrm()
{
        printf("catch a alarm signal!\n");
        exit(0);
}

int main()
{
        int ret = 0;
        int alarm_num = 10,sleep_num = 3;
        signal(SIGALRM,sig_alrm);
        printf("Begin to first count alarm %d seconds.\n",alarm_num);
        ret = alarm(alarm_num);
        printf("Begin to sleep cont %d seconds.\n",sleep_num);
        sleep(sleep_num);
        printf("End sleep,first_ret = %d\n",ret);
        alarm_num = 2;
        printf("Begin to second count alarm %d seconds.\n",alarm_num);
        ret = alarm(alarm_num);
        printf("second ret = %d\n",ret);
        while(1);
        return 0;
}


运行结果:

[elbort@elbort test1]$ ./test
Begin to first count alarm 10 seconds.
Begin to sleep cont 3 seconds.
End sleep,first_ret = 0
Begin to second count alarm 2 seconds.
second ret = 7
catch a alarm signal!                        //进入获得闹钟信号处理函数
[elbort@elbort test1]$

      如果有以前为进程登记的尚未超时的闹钟时钟,而且本次调用的seconds值是0,则取消以前的闹钟,其余值仍作为alarm函数的返回值。

代码说明:

#include "unistd.h"
#include "stdio.h"

int main()
{
        int ret;
        ret = alarm(8);
        printf("First ret = %d\n",ret);
        printf("Here sleep 2 seconds.\n");
        sleep(2);
        ret = alarm(0);
        printf("Second ret = %d\n",ret);
        printf("Here sleep 10 seconds.\n");
        sleep(10);
        printf("The alarm is cancle.The process don't catch the SIGALRM\n");
        return 0;
}

运行结果:

[elbort@elbort test1]$ ./test1
First ret = 0
Here sleep 2 seconds.
Second ret = 6
Here sleep 10 seconds.
The alarm is cancle.The process don't catch the SIGALRM
[elbort@elbort test1]$

2.pause函数

2. pause函数:

pause函数使调用进程挂起, 直到捕捉到一个信号. 它的原型如下:

#include  < unistd.h >

int  pause();

返回
- 1 , 并将errno设置为EINTR.

这个函数很简单, 由字面意思就可以理解出来"暂停". pause只有在执行了一个信号处理程序并从其返回时, pause才返回.

代码说明:

#include "unistd.h"
#include "stdio.h"
#include "signal.h"
#include "stdlib.h"
#include <sys/types.h>

pid_t main_pid;
void sig_alrm()
{
        printf("catch a alarm signal!\n");
        kill(main_pid,SIGCONT);
}
int main()
{

        int alarm_num = 5;
        main_pid = getpid();
        signal(SIGALRM,sig_alrm);
        printf("Begin to count alarm %d seconds.\n",alarm_num);
        alarm(alarm_num);
        pause();
        printf("main catch SIGCONT.\n");
        return 0;
}

结果显示:

[elbort@elbort test1]$ ./h
Begin to count alarm 5 seconds.
catch a alarm signal!
main catch SIGCONT.
[elbort@elbort test1]$


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值