天天看点

alarm/pause

最近做了个终端I/O的问题,一个简单的东西是做出来了,可是并不怎么理解,发现APUE上刚好有,那么就暂且放一放,等以后弄明白了,再写因为进程间通信的消息队列和信号量的问题看得不明白,并且看得激情也不高,所以就暂且简单写下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 <signal.h>

#include <unistd.h>

         alarm(3);

         pause();

         printf("end\n");

         return 0;

}那么是进程挂起3s后,打印Alarm Clock就完了,为什么没有打印end呢?因为alarm没人理,所以就终止了进程,使得printf("end\n");没有机会执行了

补充:被pause的进程,不再响应SIGTERM等许多信号,唯一能够保证杀死进程的方法就是使用kill命令向该进程发送SIGKILL信号。

从该例可以看出,SIGALRM信号还是响应的

继续阅读