子程序的非同步等待方式

2021-08-02 15:56:44 字數 1195 閱讀 4431

通過之前所學的知識,我們可以了解到,通過wait函式或者waitpid函式可以清理殭屍程序,父程序可以通過兩種方式等待子程序,一種是阻塞方式,另一種是非阻塞方式,而不管是那種方式,父程序都做不到完全不理會子程序而去完成自己的動作,即子程序不能達到非同步等待的目的。

一、sigchld訊號

1、關於sigchld訊號

子程序在終止時會給父程序發sigchld訊號,該訊號的預設處理動作是忽略,父程序可以自定義sigchld訊號的處理函式,這樣父程序就可以進行自己的動作而不必管理子程序,子程序只需要在退出時通知父程序,父程序在訊號處理函式中呼叫wait函式來清理子程序即可。

2、舉例說明

#include 

#include

#include

#include

#include

#include

void handler(int sig)

else

}while(1);

}int main()

else

}return

0;}

該程式的執行結果如下:

說明:父程序fork乙個子程序,子程序呼叫exit(2)終止,父程序自定義sigchld訊號處理函式,在handler函式中獲得子程序的退出狀態並列印。

二、不產生殭屍程序的另一種方法

父程序呼叫sigaction函式將sigchld訊號的處理動作設定為sig_ign,這樣fork出來的子程序在終止時會自動清理掉,不會產生殭屍程序,也不會通知父程序。

舉例說明:

#include 

#include

#include

#include

int main()

else

}return

0;}

該程式的執行結果如下:

說明:系統預設的忽略動作和使用者用sigaction自定義的忽略動作通常是沒有區別的,但是這是乙個特例。

子程序的非同步等待方式

一 子程序退出時會給父程序傳送訊號 預設的父程序對子程序的操作是忽略,而子程序退出時會向父程序傳送乙個訊號,我們現在要做的就是捕捉子程序退出時向父程序傳送的訊號。如下 1 include 2 include 3 include 4 include 5 include 6 include 7 8 vo...

子程序的非同步等待方式

等待分為阻塞等待和非阻塞等待,我們非阻塞等待來實現非同步。1.子程序終止時會給父程序傳送sigchid訊號 2.為了驗證子程序在退出時確實向父程序傳送了sigchid訊號,我們對sigchid訊號進行捕捉。很顯然我們是捕捉到sigchid訊號的。3.wait 和waitpid 的區別 1 wait ...

子程序的非同步等待方式

原來只給大家介紹過殭屍程序,而沒有介紹殭屍程序是怎麼 的,今天就給大家介紹一下如何 殭屍程序。用wait和waitpid函式清理殭屍程序,父程序可以阻塞等待子程序結束,也可以非阻塞地查詢是否有子程序結束等待清理 也就是輪詢的方式 採用第一種方式,父程序阻塞了就不能處理自己的工作了 採用第二種方式,父...