子程序的非同步等待方式

2021-08-02 16:51:18 字數 1948 閱讀 1032

原來只給大家介紹過殭屍程序,而沒有介紹殭屍程序是怎麼**的,今天就給大家介紹一下如何**殭屍程序。

用wait和waitpid函式清理殭屍程序,父程序可以阻塞等待子程序結束,也可以非阻塞地查詢是否有子程序結束等待清理(也就是輪詢的方式)。採用第一種方式,父程序阻塞了就不能處理自己的工作了;採用第二種方式,父程序在處理自己的工作的同時還要記得時不時地輪詢一下(也就是過一段時間過來看一下是否有子程序退出然後**它)。

其實,子程序在終止時會給父程序發sigchld訊號,該訊號的預設處理動作是忽略,父程序可以自定義sigchld訊號的處理函式,這樣父程序只需專心處理自己的工作,不必關心子程序了,子程序終止時會通知父程序,父程序在訊號處理函式中呼叫wait清理子程序即可。

下面我們用自定義的訊號捕捉函式來捕捉sigchld訊號。先讓父程序fork出乙個子程序,讓子程序sleep3秒之後在退出,這時候我們對sigchld訊號程序捕捉,列印出我們想要的語句,這樣就可以驗證子程序會對父程序傳送sigchld訊號。

測試如下:

在上面的**中我們讓子程序先退出,這是我們對sigchld訊號進行了捕捉,然後在我們的捕捉函式中列印了捕捉的訊號為17,而在下面我們可以看出17號訊號為sigchld。

父程序等待子程序的非同步版本 :

首先必須介紹waitpid這個函式:

pid_t waitpid(pid_t pid, int *status, int options);
引數1:pid

pid=-1,等待任乙個子程序。與wait等效。

pid>0.等待其程序id與pid相等的子程序。

pid==0等待其組id等於呼叫程序組id的任乙個子程序。

pid引數2:status

wifexited(status)

: 若為正常終止子程序返回的狀態,則為真。(檢視程序是否是正常退出)

wexitstatus(status)

: 若wifexited非零,提取子程序退出碼。(檢視程序的退出碼)

引數3:options

wnohang:非阻塞式等待指定的程序。

wuntraced:如果子程序進入暫停執行則馬上返回,但結束狀態不予以例會。

wcontinued:若實現支援作業控制,那麼由pid指定的任一子程序在暫停後已經繼續,但狀態尚未報告,則返回狀態。

下面我們直接測試子程序的已步等待方式

將waitpid的第乙個引數設定為-1等待任何乙個子程序,將引數3設定為wnohang非阻塞是等待程序。

在上面的**中我們可以看出兩個子程序分別是2907和2906,父程序為2905。當程序2069程序直接退出後給父程序傳送了sigchld訊號,這時候父程序捕捉到了子程序傳送的訊號並列印了子程序的id 2906,然後列印自己的id 2905,等待了1秒後子程序2907退出給父程序傳送了訊號sigchld,然後父程序接受並列印。

子程序的非同步等待方式

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

子程序的非同步等待方式

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

子程序的非同步等待方式

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