LINUX 程序等待

2021-08-19 19:01:31 字數 2892 閱讀 6003

wait()函式一般用在父程序中等待**子程序的資源,而防止殭屍程序的產生。什麼是殭屍程序?

pid_t wait (int * status);

引數 status 是乙個整形指標。如果status不是乙個空指標,則終止程序的終止狀態將儲存在該指標所指向的記憶體單元中。如果不關心終止狀態,可以將 status引數設定為null。

status 不是null時子程序的結束狀態值會由引數 status 返回,而子程序的程序識別碼作為函式返回值返回。

呼叫 wait 函式時,呼叫程序將會出現下面的情況:

1· 如果其所有子程序都還在執行,則阻塞。

2· 如果乙個子程序已經終止,正等待父程序獲取其終止狀態,則獲取該子程序的終止狀態然後立即返回。

3· 如果沒有任何子程序,則立即出錯返回。 [1]

如果執行成功則返回子程序識別碼(pid),如果有錯誤發生則返回-1。失敗原因存於errno 中。

#include

#include

#include

#include

main()

else

結果

this is the child process.pid=1501

this is the parent process .wait

for child...

child』s pid =1501,exit status =5

pid_t waitpid(pid_t pid,int * status,int options);

waitpid()會暫時停止目前程序的執行,直到有訊號來到或子程序結束,如果在呼叫 waitpid()時子程序已經結束,則 waitpid()會立即返回子程序結束狀態值。 子程序的結束狀態值會由引數 status 返回,而子程序的程序識別碼也會一起返回。如果不在意結束狀態值,則引數 status 可以設成 null。引數 pid 為欲等待的子程序識別碼,

pid<-1 等待程序組識別碼為 pid 絕對值的任何子程序。

pid=-1 等待任何子程序,相當於 wait()。

pid=0 等待程序組識別碼與目前程序相同的任何子程序。

pid>0 等待任何子程序識別碼為 pid 的子程序。

引數options提供了一些額外的選項來控制waitpid,引數 option 可以為 0 或可以用」|」運算子把它們連線起來使用,比如:

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

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

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

wnohang 若pid指定的子程序沒有結束,則waitpid()函式返回0,不予以等待。若結束,則返回該子程序的id。

wuntraced 若子程序進入暫停狀態,則馬上返回,但子程序的結束狀態不予以理會。wifstopped(status)巨集確定返回值是否對應與乙個暫停子程序。

子程序的結束狀態返回後存於 status,底下有幾個巨集可判別結束情況:

wifexited(status)如果若為正常結束子程序返回的狀態,則為真;對於這種情況可執行wexitstatus(status),取子程序傳給exit或_eixt的低8位。

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

wifsignaled(status)若為異常結束子程序返回的狀態,則為真;對於這種情況可執行wtermsig(status),取使子程序結束的訊號編號。

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

wifstopped(status) 若為當前暫停子程序返回的狀態,則為真;對於這種情況可執行wstopsig(status),取使子程序暫停的訊號編號。

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

如果執行成功則返回子程序識別碼(pid) ,如果有錯誤發生則返回

返回值-1。失敗原因存於 errno 中。

int main( void )

else

if ( childpid == 0 )

else

exit(exit_success);

}

結果

[root@localhost src]# gcc waitpid.c

[root@localhost src]# ./a.out

in child process

child pid = 4469

child ppid = 4468

in parent

parent pid = 4468

parent ppid = 4379

child process exited with status 0

[root@localhost src]#

如果將上面「waitpid( childpid, &status, 0 );」行注釋掉,程式執行效果如下:

[root@localhost src]# ./a.out

in child process

inparent

parent pid = 4481

parent ppid = 4379

child process exited with status1

[root@localhost src]# child pid = 4482

child ppid = 1

//子程序還沒有退出,父程序已經退出了。

Linux 程序等待

目錄 程序等待 程序等待的必要性 程序等待的方法 wait waitpid 引數int status 誰要等待?等待什麼?為什麼要等待 首先要知道程序終止或退出的時候會發生什麼,程序退出時會關閉所有檔案描述符,釋放在使用者空間分配的記憶體,但是pcb卻會暫時保留,裡面存著退出狀態,比如乙個程序正常退...

Linux 程序等待

阻塞等待 為了完成乙個功能發起呼叫,當前若不具備完成條件,等待直到條件具備完成功能後返回 非阻塞等待 為了完成乙個功能發起呼叫,當前若不具備完成條件,則立即報錯返回 wait方法 功能 阻塞等待 任意乙個子程序退出,獲取返回值 include include pid t wait int statu...

Linux 程序等待

include include pid t wait int status 返回值 成功返回等待程序pid,失敗返回 1.引數 輸出型引數,獲取最近稱退出狀態,不關心則可以設定為nullpid t waitpid pid t pid,int status,int optons 返回值 當正常返回的時...