linux中waitpid函式用法

2021-06-08 08:07:10 字數 2719 閱讀 4337

waitpid系統呼叫在linux函式庫中的原型是:

#include 

#include pid_t waitpid(pid_t pid,int *status,int options)

從本質上講,系統呼叫waitpid和wait的作用是完全相同的,但waitpid多出了兩個可由使用者控制的引數pid和options,從而為我們程式設計提供了另一種更靈活的方式。下面我們就來詳細介紹一下這兩個引數:

pid從引數的名字pid和型別pid_t中就可以看出,這裡需要的是乙個程序id。但當pid取不同的值時,在這裡有不同的意義。

pid>0時,只等待程序id等於pid的子程序,不管其它已經有多少子程序執行結束退出了,只要指定的子程序還沒有結束,waitpid就會一直等下去。

pid=-1時,等待任何乙個子程序退出,沒有任何限制,此時waitpid和wait的作用一模一樣。

pid=0時,等待同乙個程序組中的任何子程序,如果子程序已經加入了別的程序組,waitpid不會對它做任何理睬。

pid<-1時,等待乙個指定程序組中的任何子程序,這個程序組的id等於pid的絕對值。

options

options提供了一些額外的選項來控制waitpid,目前在linux中只支援wnohang和wuntraced兩個選項,這是兩個常數,可以用"|"運算子把它們連線起來使用,比如:

ret=waitpid(-1,null,wnohang | wuntraced);

如果我們不想使用它們,也可以把options設為0,如:

ret=waitpid(-1,null,0);

如果使用了wnohang(wait no hung)引數呼叫waitpid,即使沒有子程序退出,它也會立即返回,不會像wait那樣永遠等下去。

而wuntraced引數,由於涉及到一些跟蹤除錯方面的知識,加之極少用到,這裡就不多費筆墨了,有興趣的讀者可以自行查閱相關材料。

wait不就是經過包裝的waitpid嗎?沒錯,察看《核心原始碼目錄》/include/unistd.h檔案349-352行就會發現以下程式段:

static inline pid_t wait(int * wait_stat)

1.9.2 返回值和錯誤

waitpid的返回值比wait稍微複雜一些,一共有3種情況:

當正常返回的時候,waitpid返**集到的子程序的程序id;

如果設定了選項wnohang,而呼叫中waitpid發現沒有已退出的子程序可收集,則返回0;

如果呼叫中出錯,則返回-1,這時errno會被設定成相應的值以指示錯誤所在;

當pid所指示的子程序不存在,或此程序存在,但不是呼叫程序的子程序,waitpid就會出錯返回,這時errno被設定為echild;

#include #include #include main() do

}while(pr==0); 

if(pr==pc)

printf("successfully release child %d\n", pr);

else

printf("some error occured\n");

}

編譯並執行:

$ cc waitpid.c -o waitpid

$ ./waitpid

no child exited

no child exited

no child exited

no child exited

successfully 

release child 1526

父程序經過4次失敗的嘗試之後,終於收集到了退出的子程序。

因為這只是乙個例子程式,不便寫得太複雜,所以我們就讓父程序和子程序分別睡眠了4秒鐘和1秒鐘,代表它們分別作了4秒鐘和1秒鐘的工作。父子程序都有工作要做,父程序利用工作的簡短間歇察看子程序的是否退出,如退出就收集它.這樣的話,既不影響父程序的工作,也可以消除殭屍程序.

最後 不管是 wait 還是waitpid函式都有個引數來反映子程序的結束狀態,底下有幾個巨集可判別結束情況,引數當然是指標指向的那個

wifexited(status)如果子程序正常結束則為非0 值。

wexitstatus(status)取得子程序exit()返回的結束**,一般會先用wifexited 來判斷是否正常結束才能使用此巨集。

wifsignaled(status)如果子程序是因為訊號而結束則此巨集值為真

wtermsig(status) 取得子程序因訊號而中止的訊號**,一般會先用wifsignaled 來判斷後才使用此巨集。

wifstopped(status) 如果子程序處於暫停執**況則此巨集值為真。一般只有使用wuntraced 時才會有此情況。

wstopsig(status) 取得引發子程序暫停的訊號**,一般會先用wifstopped 來判斷後才使用此巨集。

wait函式和waitpid函式

1.殭屍程序 說明子程序結束但是沒有完全釋放記憶體 在核心中的task struct沒有釋放 該程序就會成為殭屍程序 當殭屍程序的父程序結束後就會被init程序 1號程序 接管,最終被 殭屍程序的危害 如果你不處理殭屍程序的話,那麼保留的那段資訊就不會釋放,其程序號就會一定被占用,但是系統所能使用的...

wait函式和waitpid函式

1 wait函式 當乙個程序結束時,會關閉所有的檔案描述符,釋放所有的記憶體空間,但依然儲存其pcb,核心在pcb中儲存著一些資訊。如果是正常退出,則會儲存退出狀態。如果是異常終止,則儲存是哪個訊號終止了該程序。父程序通過呼叫wait 或者waitpid 函式,來獲取這些資訊,之後徹底清除改程序。只...

waitpid函式原始碼

int sys waitpid pid t pid,unsigned long stat addr int options 掛起當前程序,直到pid指定的子程序退出終止或者收到要求終止該程序 的訊號 或者需要呼叫 乙個訊號處理函式 elseif pid elseif pid 1 以下的語名定為要找到...