linux中的訊號處理 signal和alarm

2021-04-06 22:28:23 字數 1440 閱讀 1116

訊號是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 ...

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 ...