天天看點

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信号還是響應的

繼續閱讀