Linux程序間通訊 2 訊號

2022-02-13 14:04:18 字數 2120 閱讀 6634

《unix網路程式設計 卷2 程序間通訊(第2版)(中文版)》

訊號本質:

訊號是在軟體層次上對中斷機制的一種模擬。在原理上,乙個程序收到乙個訊號與處理器收到乙個中斷請求可以說是一樣的。訊號是非同步的,乙個程序不必通過任何操作來等待訊號的到達,事實上,程序也不知道訊號到底什麼時候到達。訊號可以直接進行使用者空間程序和核心程序之間的互動,核心程序也可以利用它來通知使用者空間程序發生了哪些系統事件。訊號是程序間通訊機制中唯一的非同步通訊機制,可以看作是非同步通知,通知接收訊號的程序有哪些事情發生了。

下面是幾種常見的訊號:

sighup :從終端上發出的結束訊號.

sigint :來自鍵盤的中斷訊號 ( ctrl + c ) .

sigkill :該訊號結束接收訊號的程序 .

sigterm:kill 命令發出 的訊號.

sigchld:標識子程序停止或結束的訊號.

sigstop:來自鍵盤 ( ctrl + z ) 或除錯程式的停止執行訊號.

程序對訊號的響應:程序可以通過三種方式來響應乙個訊號:

(1)忽略訊號,即對訊號不做任何處理,其中,有兩個訊號不能忽略:sigkill及sigstop;

(2)捕捉訊號。定義訊號處理函式,當訊號發生時,執行相應的處理函式;

(3)執行預設操作,linux對每種訊號都規定了預設操作。

訊號生命週期:

對於乙個完整的訊號生命週期(從訊號傳送到相應的處理函式執行完畢)來說,可以分為三個重要的階段,這三個階段由四個重要事件來刻畫:訊號誕生;訊號在程序中註冊完畢;訊號在程序中的登出完畢;訊號處理函式執行完畢。相鄰兩個事件的時間間隔構成訊號生命週期的乙個階段。

這裡訊號的產生、註冊、登出等是指訊號的內部實現機制,而不是訊號的函式實現。因此,訊號註冊與否與後面要講的傳送訊號函式(如kill等)及訊號安裝函式(如signal等)無關,只與訊號值有關。

訊號傳送與捕捉:

訊號傳送:kill()和raise()

/*

kill_raise.c

*/#include

#include

#include

#include

#include

intmain()

if(pid==0

)

else

}waitpid(pid,null,0);

exit(0);

}}

訊號捕捉:alarm()、pause()

alarm()也常為鬧鐘函式,當定時器指定的時間到時,就向程序發出sigalarm訊號。乙個程序只有乙個鬧鐘時間,如果在呼叫alarm()之前已設定過鬧鐘時間,則任何以前的鬧鐘時間都被新值所替換。

pause()函式用於將呼叫程序掛起直至捕捉到訊號為止。

/*

alarm_pause.c

*/#include

#include

#include

intmain()

訊號處理:signal()、訊號集函式組

linux主要有兩個函式實現訊號的處理:signal()、sigaction()。其中signal()在可靠訊號系統呼叫的基礎上實現, 是庫函式。它只有兩個引數,不支援訊號傳遞資訊,主要是用於前32種非實時訊號的處理;而sigaction()是較新的函式(由兩個系統呼叫實現:sys_signal以及sys_rt_sigaction),有三個引數,支援訊號傳遞資訊,主要用來與 sigqueue() 系統呼叫配合使用,當然,sigaction()同樣支援非實時訊號的處理。sigaction()優於signal()主要體現在支援訊號帶有引數。

/*

signal.c

*/#include

#include

#include

#include

void func(int

sign_no)

if(sign_no ==sigquit)

}int

main()

/*sigaction.c

*/int

main()

Linux 程序間通訊 訊號

訊號是在軟體層次上對中斷機制的一種模擬,在原理上,乙個程序收到乙個訊號與處理器收到乙個中斷請求可以說是一樣的。訊號是非同步的,乙個程序不必通過任何操作來等待訊號的到達,事實上,程序也不知道訊號到底什麼時候到達。訊號是程序間通訊機制中唯一的非同步通訊機制,可以看作是非同步通知,通知接收訊號的程序有哪些...

Linux程序間通訊 訊號

1.什麼是訊號 訊號是linux系統響應某些條件而產生的乙個事件,接收到該訊號的程序會執行相應的操作。2.訊號的產生 1 由硬體產生,如從鍵盤輸入ctrl c可以終止當前程序 2 由其他程序傳送,如可在shell程序下,使用命令 kill 訊號標號 pid,向指定程序傳送訊號。3 異常,程序異常時會...

Linux程序間通訊 訊號

訊號 signals 是unix 類unix以及其他posix相容的作業系統中程序間通訊的一種有限制的方式。它是一種非同步的通知機制,用來提醒程序乙個事件已經發生。當乙個訊號傳送給乙個程序,作業系統中斷了程序正常的控制流程,此時,任何非原子操作都將被中斷。如果程序定義了訊號的處理函式,那麼它將被執行...