訊號是unix中所使用的程序通訊的一種最古老的方法.系統使用它來同志乙個或多個程序非同步事件的發生.
linux系統庫bits/signum.h對訊號名作了定義:
linux的大多數訊號是提供給核心的,僅有少數幾種訊號可以在訊號間傳送.
.sighup 當終止乙個終端時,核心就把這種訊號傳送給該終端所控制的所有程序.
.sigint 當乙個使用者按下中斷鍵(ctrl+c)後,核心就向該終端用關聯的所有程序傳送這個訊號.
.sigquit 當使用者按下(ctrl+),核心就向該終端用關聯的所有程序傳送這個訊號.
.sigill 當乙個程序企圖執行一條非法指令時,核心就傳送這個訊號.
.sigfpe 當產生浮點錯誤時,核心就傳送這個訊號.
.sigkill 這是乙個非常特殊的訊號,他可以從乙個程序傳送到另乙個程序,使接收到該訊號的程序終止.核心偶然也傳送這種訊號.
.sigalrm 當乙個定時器到時的時候,核心就傳送這個訊號.
.sigstop 子程序結束訊號.unix用它來實現系統呼叫exit(),wait();
訊號的處理
unix的系統呼叫signal()用於接受乙個指定的訊號,並可以指定相應的處理方法.
在linux系統庫signal.h中,它的說明如下:
signal(int sig,sighandler_t handler);
sig用於指定訊號型別.handle是用於處理該訊號的函式.
handle還可以是:
.sig_ign 忽略這個訊號.
.sig_dfl 恢復對這個訊號的預設處理.
例如:main()
上面的**忽略了sinint訊號.
又例如:
int catch(int sig);
main()
int catch(int sig)
當使用者按下ctrl+c時,程序被中斷,catch()被執行.中斷處理函式處理完畢後,轉回斷點執行下面的指令.
當編寫自己的中斷處理函式時,注意下面兩點:
1.訊號不能打斷系統呼叫.
2.訊號不能打斷訊號處理函式.
alarm(設定訊號傳送鬧鐘)
定義函式
unsigned int alarm(unsigned int seconds);
函式說明
alarm()用來設定訊號sigalrm在經過引數seconds指定的秒數後傳送給目前的程序。如果引數seconds 為0,則之前設定的鬧鐘會被取消,並將剩下的時間返回。
返回值返回之前鬧鐘的剩餘秒數,如果之前未設鬧鐘則返回0。
範例void handler()
main()}執行
sleep 1 ...
sleep 2 ...
sleep 3 ...
sleep 4 ...
sleep 5 ...
hello
sleep 6 ...
trackback:
Linux中的訊號處理
突然想起使用sigaction註冊訊號處理函式時,訊號處理函式型別有二個 struct sigaction 通過對上面的sa flags賦值為sa siginfo,讓系統使用多引數的訊號處理函式。在處理函式中,由於傳進來乙個siginfo t的引數,我們可以通過它獲取到哪個程序傳進來的訊息。今天試了...
Linux的訊號處理
linux為實現訊號處理提供了比較多的介面,看似紛雜,但理清訊號的關係後還是很有條理的。主要分為以下四組,怎麼傳送乙個訊號,收到乙個訊號後做什麼樣的處理,主動等待乙個訊號的發生,對特定訊號只記錄是否發生供以後再處理 四組的api如下 不考慮多執行緒 傳送訊號 kill,alarm,arise 安裝訊...
Linux 訊號處理
用sigcation函式 在標頭檔案signal.h中 來設定自己的訊號處理函式,用法參見 各種訊號參見 寫了個sigint,也就是c c鍵的處理例子 include includestruct sigaction newsigint,oldsigint void signalinthandler ...