Linux應用程式設計 09 程序間通訊 訊號通訊

2021-09-22 08:04:58 字數 2274 閱讀 6446

訊號通訊

訊號是在軟體層次上對中斷機制的一種模擬,是一種非同步通訊方式訊號可以直接進行使用者空間程序和核心程序之間的互動,核心程序也可以利用它來通知使用者空間程序發生了哪些系統事件

如果該程序當前並未處於執行態,則該訊號就由核心儲存起來,直到該程序恢復執行再傳遞給它;如果乙個訊號被程序設定為阻塞,則該訊號的傳遞被延遲,直到其阻塞被取消時才被傳遞給程序

訊號的生存週期

使用者程序對訊號的響應方式:

忽略訊號:對訊號不做任何處理,但是有兩個訊號不能忽略:即sigkill及sigstop

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

執行預設操作(預設方式):linux對每種訊號都規定了預設操作

訊號處理流程

使用訊號的場合

後台程序需要使用訊號,如xinetd

如果兩個程序沒有親緣關係,無法使用無名管道

如果兩個通訊程序之一只能使用標準輸入和標準輸出,則無法使用fifo

常見訊號的含義及預設操作

訊號傳送與捕捉

kill()和raise()

kill函式同讀者熟知的kill系統命令一樣,可以傳送訊號給程序或程序組(實際上,kill系統命令只是kill函式的乙個使用者介面)。

kill –l 命令檢視系統支援的訊號列表

raise函式只允許程序向自己傳送訊號

成功時返回0,失敗時返回eof

pid 接收程序的程序號;0代表同組程序; -1代表所有進

sig 訊號型別

訊號相關函式 – alarm / pause

成功時返回上個定時器的剩餘時間,失敗時返回eof

seconds 定時器的時間

乙個程序中只能設定乙個定時器,時間到時產生sigalrm

程序一直阻塞,直到被訊號中斷

被訊號中斷後返回-1,errno為eintr

3. 成功時返回原先的訊號處理函式,失敗時返回sig_err

4. signo 要設定的訊號型別 handler 指定的訊號處理函式:

5. sig_dfl代表預設方式; sig_ign 代表忽略訊號;

訊號的處理

訊號函式 kill/ raise– 示例

int main(int argc, const char *ar**)

if(pid == 0)

else

waitpid(pid, null, 0);

exit(0);

}// return 0;

}訊號函式 alarm / pause – 示例

int main(int argc, const char *ar**)

訊號函式 signal – 示例

Linux應用程式設計 程序通訊

通訊方式有管道pipe,訊號 一 pipe 管道分兩種無名管道,有名管道。1 無名管道 父程序和子程序可通過無名管道傳輸資料,管道有兩個口,一端寫一端讀,半雙工通訊。可以當作檔案進行操作,所以建立的管道會有兩個檔案描述符fds 0 和fds 1 fds 0 用於讀,fds 1 用於寫,關係如圖。實驗...

Linux應用程式設計之程序程式設計

程序同步 一組併發的程序按照一定的順序執行的過程稱為程序間的同步。獲取id include pid t getpid void 獲取本程序id pid t getppid void 在子程序中獲取父程序id 程序建立 include pid t fork void fork 的奇妙之處在於它被呼叫一...

Linux應用程式設計之程序程式設計

程序同步 一組併發的程序按照一定的順序執行的過程稱為程序間的同步。獲取id include pid t getpid void 獲取本程序id pid t getppid void 在子程序中獲取父程序id 程序建立 include pid t fork void fork 的奇妙之處在於它被呼叫一...