wait() 是屬於程序的函式。
1.wait()
標頭檔案:
#include
#include
函式原型: int wait(int * status)
當乙個程序正常或異常終止時,pcb(核心中的程序控制塊)就向其父程序傳送sigchld訊號。因為子程序終止是個非同步事件,這種訊號也是核心向父程序發的非同步通知。父程序可以忽略該訊號,或者提供乙個該訊號發生時即被呼叫執行的函式(訊號處理程式)。
函式功能:
父程序一旦呼叫wait函式就立即阻塞自己,由wait分析是否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個已經變成zombie的子程序,wait就會收集這個子程序的資訊,並把它徹底銷毀後返回,如果沒有找到,就一直阻塞,直至找到乙個結束的子程序或接收到了乙個指定的訊號為止。
當父程序忘記呼叫wait()等待已終止的子程序,子程序就會進入一種沒有父程序的狀態,此時子程序就是zombie(殭屍)程序。
ps: wait()與fork()配套出現,如果在fork()之前呼叫wait(), wait返回-1,正常情況下,應返回子程序pid。
引數status用來儲存被收集程序退出時的狀態,它是乙個指向int型別的指標,如果我們對這個子程序如何死掉的不在意,只想這把這個被殭屍程序消滅掉,就把這個引數置為null,
pid=wait(null);
如果成功返回子程序pid,如果沒有子程序,失敗,則返回-1,同時,error被置為echild。
如果status的值不是null,wait把子程序的退出狀態取出並存入其中,這是乙個整數值(int)
它指出了子程序是正常退出還是非正常結束,以及正常結束的返回值,或被那個訊號結束等資訊。由於這些資訊被存放在乙個整數的不同二進位制位中,所以用常規的方法很麻煩。那麼,我們就有乙個專門的巨集macro來完成。
1. wifexited(status)
這個巨集用來指出子程序是否正常退出,如果是就返回乙個非零值。
注意:這個巨集中的引數status不是wait中的那個status,wait中的那個status是指向int型的指標,它指向乙個整數值,而那個值就是這個巨集中的status。
2. wexitstatus(status)
當wifexited返回非零值時, 即子程序正常退出時,就可以用這個巨集提取子程序返回值,如果子程序呼叫exit(5)退出,返回5(即子程序的退出**).如果子程序呼叫exit(0)退出,此時就沒有意義了。
2.waitpid()
waitpid()的作用和wait()一樣,但它並不一定要等待第乙個終止的子程序,它還有若干選項,如可提供乙個非阻塞版本的wait()功能等。實際上wait()函式只是waitpid()函式的乙個特例,在linux內部實現wait()函式時直接呼叫的就是waitpid()函式。
3.下面說說子程序和父程序
1) 父程序先於子程序結束
子程序成了孤兒程序,當父程序退出時,系統會讓pid為1的程序接管子程序。
ps:pid為1的程序是init或者systemd
2) 子程序先於父程序結束
子程序成了殭屍(zombie)程序,並且子程序會一直保持這樣的狀態直至重啟,此時核心只會保留程序的一些必要資訊以備父程序所需,此時子程序始終占有資源,同時也減少了系統可以建立的最大程序數。
3) 子程序先於父程序結束,但是父程序呼叫了wait函式
此時,父程序會等待子程序結束
wait函式詳解
include 提供型別pid t的定義 include pid t wait int status 程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個已經變成殭屍的子程序,wait就會收集這個子程序的資訊,並把它徹底銷毀後返回 如果沒...
wait和waitpid函式詳解
wait的函式原型是 include include pid t wait int status 程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是 否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個 已經變成殭屍的子程序,wait就會收集這個子程序的資訊,並 把它徹底銷毀後返回 如果...
wait函式和waitpid函式
1.殭屍程序 說明子程序結束但是沒有完全釋放記憶體 在核心中的task struct沒有釋放 該程序就會成為殭屍程序 當殭屍程序的父程序結束後就會被init程序 1號程序 接管,最終被 殭屍程序的危害 如果你不處理殭屍程序的話,那麼保留的那段資訊就不會釋放,其程序號就會一定被占用,但是系統所能使用的...