等待分為阻塞等待和非阻塞等待,我們非阻塞等待來實現非同步。
1.子程序終止時會給父程序傳送sigchid訊號
2.為了驗證子程序在退出時確實向父程序傳送了sigchid訊號,我們對sigchid訊號進行捕捉。
很顯然我們是捕捉到sigchid訊號的。
3.wait()和waitpid()的區別
<1>wait 函式:用來等待任何乙個子程序退出,由父程序呼叫。
includeincludepid_t wait(int* status);
返回值:成功返回被等待子程序的pid,失敗返回-1。
status:輸出型引數,拿回子程序的退出資訊。
wait:阻塞式呼叫,等待的子程序不退出時,父程序一直不退出。
目的:**子程序,系統**子程序的空間。
如果引數status不為空,則程序終止狀態被儲存於其中。
依據傳統,返回的整形狀態字是由實現定義的,其中有些位表示退出狀態(正常返回),其他位表示訊號編號(異常返回),有一位表示是否產生了乙個core檔案等。
終止狀態是定義在 sys/wait.h中的各個巨集,有四可互斥的巨集可以用來取得程序終止的原因。
wifexited:正常返回時為真,可以執行巨集函式 wexitstatus獲取子程序傳送給exit、_exit或_exit的引數的低8位。
wifsignaled :異常返回時為真,可以執行巨集函式wtermsig取得子程序終止的訊號編號,另外,對於一些實現,定義有巨集wcoredump巨集,若以經昌盛終止程序的core檔案,則為真。
wifstopped :若為當前暫停子程序的返回的狀態,則為真,可執行wstopsig取得使子程序暫停的訊號編號。
wifcontinued:若在作業控制暫停後已經繼續的子程序返回了狀態,則為真,僅用於waitpid。
<2>waitpid:
includeincludepid_t waitpid(pid_t pid,int* status,int options);
1>引數:
pid引數
從引數的名字pid和型別pid_t中就可以看出,這裡需要的是乙個程序id。但當pid取不同的值時,在這裡有不同的意義。
pid>0時,只等待程序id等於pid的子程序,不管其它已經有多少子程序執行結束退出了,只要指定的子程序還沒有結束,waitpid就會一直等下去。
pid=-1時,等待任何乙個子程序退出,沒有任何限制,此時waitpid和wait的作用一模一樣。
pid=0時,等待同乙個程序組中的任何子程序,如果子程序已經加入了別的程序組,waitpid不會對它做任何理睬。
pidstatus引數與wait()函式的基本相同,此處不再贅述。
options引數
當options引數為0時,與wait功能相同,仍是阻塞式等待,不提供額外功能,如果為下列常量按位或則提供更多功能:
wcontinued:若實現支援作業控制,那麼由pid指定的任一子程序在暫停後已經繼續,但狀態尚未報告,則返回狀態
wnohang:若由pid指定的子程序並不是立即可用的,則waitpid不阻塞,即此時以非阻塞方式(輪詢式訪問的必要條件)等待子程序,並且返回0。
wuntraced:若實現支援作業控制,而pid指定的任一子程序已經暫停,且其狀態尚未報告,則返回其狀態
2>返回值:
當正常返回的時候,waitpid返**集到的子程序的程序id;
如果設定了選項wnohang,而呼叫中waitpid發現沒有已退出的子程序可收集,則返回0;
如果呼叫中出錯,則返回-1,這時errno會被設定成相應的值以指示錯誤所在;
當pid所指示的子程序不存在,或此程序存在,但不是呼叫程序的子程序,waitpid就會出錯返回,這時errno被設定為echild;
3>waitpid提供了三個wait所沒有的功能:
1. waitpid可等待乙個特定的程序
2. waitpid提供了乙個wait的非阻塞版本
3. waitpid支援作業控制
子程序的非同步等待方式
1,非同步**殭屍程序:
fork()之後,非阻塞(非同步)等待子程序(**殭屍)。
fork()之後,子程序和父程序分叉執行,殭屍程序的產生是因為父程序沒有給子程序「收屍」造成的,又可以根據危害程度分為下述兩類:
總體來說:當子程序結束之後,但父程序未結束之前,子程序將成為殭屍程序。
(1)當子程序結束之後,但父程序未結束之前,子程序將成為殭屍程序,父程序結束後殭屍被init程序**。
(2)如果子程序結束了,但是父程序始終沒有結束,那麼這個殭屍將一直存在,而且隨著exec,殭屍越來越多。
子程序的非同步等待方式
一 子程序退出時會給父程序傳送訊號 預設的父程序對子程序的操作是忽略,而子程序退出時會向父程序傳送乙個訊號,我們現在要做的就是捕捉子程序退出時向父程序傳送的訊號。如下 1 include 2 include 3 include 4 include 5 include 6 include 7 8 vo...
子程序的非同步等待方式
通過之前所學的知識,我們可以了解到,通過wait函式或者waitpid函式可以清理殭屍程序,父程序可以通過兩種方式等待子程序,一種是阻塞方式,另一種是非阻塞方式,而不管是那種方式,父程序都做不到完全不理會子程序而去完成自己的動作,即子程序不能達到非同步等待的目的。一 sigchld訊號 1 關於si...
子程序的非同步等待方式
原來只給大家介紹過殭屍程序,而沒有介紹殭屍程序是怎麼 的,今天就給大家介紹一下如何 殭屍程序。用wait和waitpid函式清理殭屍程序,父程序可以阻塞等待子程序結束,也可以非阻塞地查詢是否有子程序結束等待清理 也就是輪詢的方式 採用第一種方式,父程序阻塞了就不能處理自己的工作了 採用第二種方式,父...