天天看點

wake-up signal SIGALRM from alarm() or setitimer(). SIG_DFL & SIG_IGN

sigalrm信号, 一般可以由alarm或者setitmer來發出。 可以用于定多長時間觸發一個事件.

例如在等待使用者輸入時, 超過多少秒就觸發這個信号. 在觸發後, 使用者輸入被中斷, 跳轉到信号處理函數, 信号處理函數結束後, 接着使用者輸入的下一個語句執行, 使用者輸入不再執行. 如下 :

執行 : 

注意這個程式有問題, 因為每隔5秒就會觸發這個信号.

應該改成 : 

在程式中要忽略某些信号或者要還原信号處理函數怎麼辦呢?

如果在程式中要忽略對信号的響應. 使用如下方法 : 

reg_handler(sigalrm, sig_ign), 表示遇到sigalrm信号不作任何響應.

例如在以上代碼中添加

則在程式執行過程中使用 "kill -int 程序号", 或者"鍵入ctrl+c" 都無響應.

如果在程式中要還原原來的signal handler, 使用如下 : 

reg_handler(sigint, sig_dfl);

注意, 

因為sigkill和sigstop信号不能調用sigaction注冊handler function. 是以也就不存在忽略這兩個信号的可能了.

下面的例子, 問問題, 如果5秒内未答出則逾時, 并raise(sigint) , 調用end_game結束程式. 或者直接ctrl+c 發出sigint信号調用end_game結束程式 : 

其他 :

【參考】

setitimer : 

http://blog.163.com/digoal@126/blog/static/163877040201272041953707/