使用alarm函數可以設置一個定時器,在將來的某個時刻該定時器超時。當定時器超時后,產生SIGALRM信號。如果忽略或不捕捉此信號,則其默認動作是終止調用該alarm函數的進程
#include<unistd,h>
unsigned int alarm(unsigned int seconds);
功能與作用:alarm()函數的主要功能是設置信號傳送鬧鍾,即用來設置信號SIGALRM在經過參數seconds秒數后發送給目前的進程。如果未設置信號SIGALARM的處理函數,那么alarm()默認處理終止進程。
函數返回值:如果在seconds秒內再次調用了alarm函數設置了新的鬧鍾,則后面定時器的設置將覆蓋前面的設置,即之前設置的秒數被新的鬧鍾時間取代;當參數seconds為0時,之前設置的定時器鬧鍾將被取消,並將剩下的時間返回。
來看下面的幾個測試:
void sig_alarm(){
printf("sig_alarm");
exit(0);
}
void signal_func1(){
signal(SIGALRM,sig_alarm);
alarm(10);
sleep(15);
printf("hello world\n");
return 0;
}
定義了一個時鍾alarm(10),它的作用是讓信號SIGALRM在經過10秒后傳送給目前signal_func1所在進程;接着又定義了sleep(15),它的作用是讓執行掛起15秒的時間。所以當signal_func1程序掛起10秒鍾時,signal函數調用SIGALRM信號的處理函數sig_alarm,並且sig_alarm執行exit(0)使得程序直接退出。因此,printf("Hello World!\n")語句是沒有被執行的。
如果改成sleep(5),掛起只有5秒的時間。那么就可以在發送信號前執行打印hello world。
pause函數:
作用:調用進程掛起直至捕捉到一個信號。只有執行了一個信號處理程序並從其返回時,pause才返回。在這種情況下,pause返回-1.
我們來看下alarm和pause結合的例子:
void sig_alarm(){
system("date");
return;
}
void signal_func1(){
signal(SIGALRM,sig_alarm);
system("date");
alarm(20);
sleep(5);
printf("%d\n",alarm(15));
pause();
}
每個進程只有一個鬧鍾時間,如果在調用alarm的時候,之前已為該進程注冊的鬧鍾時間還沒有超過時,則該鬧鍾時間的余留值作為本次alarm函數調用的值返回。以前注冊的鬧鍾時間則被新值代替.
來看下面的實現:
void sig_alarm(){
system("date");
return;
}
void signal_func1(){
signal(SIGALRM,sig_alarm);
system("date");
alarm(20);
sleep(5);
printf("%d\n",alarm(15));
pause();
}
先設置了一個鬧鍾函數alarm(20),即在20秒時將SIGALRM信號傳送送給當前進程;然后又定義了一個延時函數sleep(5),接着又定義了一個鬧鍾函數alarm(15),它的作用是清除前面設置的鬧鍾alarm(20)並返回剩余的時間20-5=15秒。所以,程序先執行system("date")語句輸出當前時間;然后進程休眠5秒后,程序執行輸出語句printf("%d\n",alarm(15)),由於alarm(15)先返回15秒,即打印輸出15;接着程序執行pause()函數,使當前進程處於掛起狀態,直到捕捉到一個信號;當再過15秒后,SIGALARM信號的處理函數sig_alrm執行system("date")語句輸出當前時間;最后pause終止進程。因此,整個程序執行的時間為5+15=20秒。