SIGCHLD訊號與父程序非同步等待子程序

2021-08-19 20:23:28 字數 1537 閱讀 1909

阻塞式等待:wait函式,當然waitpid函式當其第三個引數不為wnohang時也是阻塞式等待。

非阻塞式等待:(輪詢的方式):當waitpid函式當其第三個引數為wnohang是非阻塞式等待。

父程序可以阻塞等待子程序結束,也可以非阻塞地查詢是否有子程序結束等待清理(也就是輪詢的方式)。

若採用阻塞等待方式,父程序就不能處理自己的工作了;採用非阻塞方式,父程序在處理自己工作的同時還要時不時地輪詢⼀下子程序狀態,程式實現複雜。

sigchld訊號:sigchld是l第17號訊號.

事實上,程序等待並不是像上邊說的那樣,而是子程序在終止時會向父程序發sigchld訊號,該訊號的預設動作是忽略,父程序便可以自定義sigchld訊號的處理函式,這樣它只需專心處理自己的工作,而不必關⼼子程序了, 子程序終止時會通知父程序,父程序在訊號處理函式中呼叫wait清理子程序即可。

下面來程序程式設計驗證:

1.先來編寫子程序退出時會給父程序傳送sigchld訊號的機制:

2.父程序非同步等待子程序(即為輪詢式等待)

上邊父程序在等待子程序成功後直接退出,現在我們要實現父程序等待子程序成功後,繼續做自己的事情。這就是非同步等待。下面我們用非阻塞式等待(輪詢的方式)。

下面來解釋**:

32結果展示:

可以看出實現了父程序對子程序的非同步等待。

SIGCHLD訊號與程序非同步等待

首先,讓我們先來回顧一下有關程序等待的知識。所謂程序等待,說的就是父程序等待子程序 如圖,父程序呼叫wait和waitpid函式等待子程序,從而清理系統中的殭屍程序。在此過程中,父程序可以阻塞等待子程序結束,也可以非阻塞地查詢是否有子程序結束等待清理 也就是輪詢的方式 若採用阻塞等待方式,父程序就不...

system呼叫與SIGCHLD訊號

很多時候,我們需要通過system這個函式在程式內部來執行系統命令。比如 int rv system mount mnt hgfs 最近有同事發現system呼叫返回 1,但事實上外部命令已成功執行。經調查發現,原來是server在啟動後將自己設定為daemon時,遮蔽了sigchld訊號導致的。在...

SIGCHLD訊號與SIG IGN處理的使用

signal sigchld,sig ign 忽略sigchld訊號,這常用於併發伺服器的效能的乙個技巧 因為併發伺服器常常fork很多子程序,子程序終結之後需要 伺服器程序去wait清理資源。如果將此訊號的處理方式設為 忽略,可讓核心把殭屍子程序轉交給init程序去處理,省去了 大量殭屍程序占用系...