使用alarm函數可以設置一個計時器,在將來某個指定的時間,該計時器會超時。當計時器超時時,產生SIGALRM信號。如果不忽略或不捕捉此信號,則其默認動作是終止調用該alarm函數的進程。
#include <unistd.h>unsigned int alarm( unsigned int seconds );返回值:0或以前設置的鬧鐘時間的余留秒數
其中,參數seconds的值是秒數,經過了指定的seconds秒后會產生信號SIGALRM。要了解的是,經過了指定的秒數后,信號由內核產生,由于進程調度的延遲,所以進程得到控制從而能夠處理該信號還需要一些時間。
每個進程只能有一個鬧鐘時鐘。如果在調用alarm時,以前已為該進程設置過鬧鐘時鐘,而且它還沒有超時,則將該鬧鐘時鐘的余留值作為本次alarm函數調用的返回值。以前登記的鬧鐘時鐘則被新值代替。
如果有以前為進程登記的尚未超過的鬧鐘時鐘,而且本次調用的seconds值是0,則取消以前的鬧鐘時鐘,其余留值仍作為alarm函數的返回值。
雖然SIGALRM的默認動作是終止進程,但是大多數使用鬧鐘的進程會捕捉此信號。如果此時進程要終止,則在終止之前它可以執行所需的清理操作。如果我們想捕捉SIGALRM信號,則必須在調用alarm之前設置該信號的處理程序。如果我們先調用alarm,然后在我們能夠設置SIGALRM處理程序之前已經接收到該信號,那么進程將終止。
pause函數使調用進程掛起直至捕捉到一個信號。
#include <unistd.h>int pause(void);返回值:-1,并將errno設置為EINTR
只有執行了一個信號處理程序并從其返回時,pause才返回。在這種情況下,pause返回-1,并將errno設置為EINTR。
注意,在涉及信號時需要有精細而周到的考慮。
本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。
新聞熱點
疑難解答