#include#include void do_alarm(int num); int main(void) { //注冊一個定時器 if(signal(SIGALRM , do_alarm) == SIG_ERR) { perror("register alarm fail"); return -1; } //alarm ////3秒之後發送SIGALRM信號,但是一次性的 SIGALRM信號:定時器的信號 alarm(3); while(1) { printf("this is in main... \n"); sleep(3); } return 0 ; } void do_alarm(int num) { printf("this is in alarm ... &*&&\n"); //會影響sleep alarm(1); }
執行結果:
this is in main...
this is in alarm ... &*&&
this is in main...
this is in alarm ... &*&&
this is in main...
this is in alarm ... &*&&
this is in main...
......
在 這個頭文件中。
signal(參數1,參數2);
參數1:我們要進行處理的信號。系統的信號我們可以再終端鍵入 kill -l查看(共64個)。其實這些信號時系統定義的宏。
參數2:我們處理的方式(是系統默認還是忽略還是捕獲),這裡我寫了一個處理函數,也就是說這裡不是系統默認的。
unsigned int alarm(unsigned int seconds);
參數1:表示指定的秒數。
要注意的是,一個進程只能有一個鬧鐘時間,如果在調用alarm之前已設置過鬧鐘時間,則任何以前的鬧鐘時間都被新值所代替。需要注意的是,經過指定的秒數後,信號由內核產生,由於進程調度的延遲,所以進程得到控制從而能夠處理該信號還需要一些時間。如果有以前為進程登記的尚未超時的鬧鐘時鐘,而且本次調用的seconds值是0,則取消以前的鬧鐘時鐘,其余留值仍作為alarm函數的返回值。
以上程序是利用定時器產生的一個信號SIGALRM信號,在收到該信號同時會調用do_alarm函數。這也就類似單片機的定時中斷,當定時到了,就跳到中斷服務函數裡去執行相應的程序。