wait函式和waitpid函式

2021-09-27 13:55:21 字數 2201 閱讀 8488

1、wait函式

當乙個程序結束時,會關閉所有的檔案描述符,釋放所有的記憶體空間,但依然儲存其pcb,核心在pcb中儲存著一些資訊。

如果是正常退出,則會儲存退出狀態。

如果是異常終止,則儲存是哪個訊號終止了該程序。

父程序通過呼叫wait()或者waitpid()函式,來獲取這些資訊,之後徹底清除改程序。

只有失敗返回值 -1 .

父程序呼叫wait函式可以**子程序終止資訊,該函式有三個功能:

① 阻塞等待子程序的退出

② **子程序的殘留資源

③ 獲取子程序的結束狀態(退出原因)

當乙個程序終止是,操作的系統的隱式**機制會

①關閉所有檔案描述符

②釋放使用者空間分配的記憶體,pcb仍然存在,並儲存改程序的退出狀態

wait使用傳出引數的status來儲存今後才能退出的狀態,進一步借用巨集函式判斷程序終止的原因。可分為如下三組

wifexited(status) 為非0	→ 程序正常結束

wexitstatus(status) 如上巨集為真,

使用此巨集 → 獲取程序退出狀態 (exit的引數)

wifsignaled(status) 為非0 → 程序異常終止

wtermsig(status) 如上巨集為真,

使用此巨集 → 取得使程序終止的那個訊號的編號。

wifstopped(status) 為非0 → 程序處於暫停狀態

wstopsig(status) 如上巨集為真,

使用此巨集 → 取得使程序暫停的那個訊號的編號。

wifcontinued(status) 為真 → 程序暫停後已經繼續執行

#include

#include

#include

#include

intmain()

else

if(pid>0)

}if(wifexited

(status))if

(wifsignaled

(status)

)while(1

)}

作用等於wait,但是可以指定pid,也可以不阻塞。

pid_t waitpid

(pid_t pid,

int*status,

int options)

;

第乙個引數----->指定想要**的程序 pid

大於 0 **指定id的子程序

-1 **任意子程序(相當於wait)

0 **和當前呼叫waitpid乙個組的所有子程序 < -1 **指定程序組內的任意子程序

第二個引數----->傳出的引數

第三個引數------>選擇阻塞和不阻塞,設定為wnohang,且子程序正在執行,為非阻塞。

返回值:

成功:清理程序的pid

失敗: 返回-1

注意:一次wait或waitpid呼叫只能清理乙個子程序,清理多個子程序應使用迴圈。

示例:使用waitpid清理,指定pid的程序

Linux系統wait 和waitpid 函式

include include pid t wait int status 程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個已經變成殭屍的子程序,wait就會收集這個子程序的資訊,並把它徹底銷毀後返回 如果沒有找到這樣乙個子程序,wa...

wait函式和waitpid函式

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

wait和 wait pid函式用法

wait和 wait pid函式用法 wait的函式原型是 i nclude 提供型別pid t的定義 i nclude pid t wait int status 程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個已經變成殭屍的子程序...