最近做了個終端I/O的問題,一個簡單的東西是做出來了,可是并不怎麼了解,發現APUE上剛好有,那麼就暫且放一放,等以後弄明白了,再寫因為程序間通信的消息隊列和信号量的問題看得不明白,并且看得激情也不高,是以就暫且簡單寫下alarm()和pause()函數的應用
alarm
unsigned int alarm(unsigned int seconds);
alarm函數是設定一個計時器, 在計時器逾時的時候, 産生SIGALRM信号. 如果不忽略或捕捉此信号, 它的預設操作是終止調用該alarm函數的程序.
alarm的傳回值是無符号整型, 每個程序隻能有一個alarm維護的"鬧鐘".
如果該"鬧鐘"順利逾時, 則傳回0;
如果該"鬧鐘"在計時過程中, 調用了另一個alarm函數, 則該"鬧鐘"的餘留秒數作為該次alarm的傳回值, 并且新的"鬧鐘"開始計時.(實際上是新的鬧鐘替代了以前的鬧鐘)
pauseint 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信号還是響應的