alarm pause 的用法

 

alarm()和pause()函数的应用

alarm
unsigned int alarm(unsigned int seconds);
alarm函数是设置一个计时器, 在计时器超时的时候, 产生SIGALRM信号. 如果不忽略或捕捉此信号, 它的默认操作是终止调用该alarm函数的进程.
alarm的返回值是无符号整型, 每个进程只能有一个alarm维护的"闹钟".
如果该"闹钟"顺利超时, 则返回0;
如果该"闹钟"在计时过程中, 调用了另一个alarm函数, 则该"闹钟"的余留秒数作为该次alarm的返回值, 并且新的"闹钟"开始计时.(实际上是新的闹钟替代了以前的闹钟)
 
pause
int pause(void);
pause函数将进程挂起,直到捕捉到一个信号
#include <stdio.h>
#include <unistd.h>
#include <signal.h>

static void my_signal_alarm(unsigned int signo)
{
        printf( "my_signal_alarm\n");
        return;                                                        
}
unsigned int my_sleep(unsigned int sleep_secs)
{
       if (signal(SIGALRM,my_signal_alarm) == SIG_ERR)
            return(sleep_secs);
      alarm(sleep_secs);                
      //  pause();                                                
      printf( "my_sleep\n");
      return( alarm(0) );        //关闭上一次的时钟 并返回上次剩余的秒数
}
int main()
{
        int ret;
        ret=my_sleep(3);
        printf( "ret=%d\n",ret);
        return 0;
}
alarm函数只负责说多少秒之后会有个ALARM信号会来,并不影响后面的语句的执行,所以这个注释掉了pause函数的程序,后面的alarm(0)实际取消了原先的闹钟,返回3。
所以呢,留着这个pause还是有用的
另外补充,如果只有alarm和pause,即:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>

int main()
{
         alarm(3);
         pause();
         printf( "end\n");
         return 0;
}
那么是进程挂起3s后,打印Alarm Clock就完了,为什么没有打印end呢?因为alarm没人理,所以就终止了进程,使得 printf("end\n");没有机会执行了
补充:被pause的进程,不再响应SIGTERM等许多信号,唯一能够保证杀死进程的方法就是使用kill命令向该进程发送SIGKILL信号。
从该例可以看出,SIGALRM信号还是响应的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值