最近做了个终端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 <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信号还是响应的