Linux wait函數

來源:互聯網
上載者:User

     

 
進程一旦調用了wait,就立即阻塞自己,由wait自動分析是否當前進程的某個子進程已經退出,如果讓它找到了這樣一個已經變成殭屍的子進程,wait
就會收集這個子進程的資訊, 並把它徹底銷毀後返回;如果沒有找到這樣一個子進程,wait就會一直阻塞在這裡,直到有一個出現為止。

如果該進程沒有子進程,則立即出錯返回,傳回值為-1(注意,是wait()函數立即返回,而不是說該父進程也跟著結束了,父進程裡該語句後的內容還是要照樣接著執行的)

wait(等待子進程中斷或結束)
相關函數 waitpid,fork
表標頭檔
#include<sys/types.h>
#include<sys/wait.h>
定義函數 pid_t wait (int * status);
函數說明
wait()會暫時停止目前進程的執行,直到有訊號來到或子進程結
束。如果在調用wait()時子進程已經結束,則wait()會立即返
回子進程結束狀態值。子進程的結束狀態值會由參數status 返回,
而子進程的進程識別碼也會一快返回。如果不在意結束狀態值,則
參數status 可以設成NULL。子進程的結束狀態值請參考waitpid()。
傳回值
如果執行成功則返回子進程識別碼(PID),如果有錯誤發生則返回
-1。失敗原因存於errno 中。
附加說明
範例 一
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
int main()
{
pid_t pid;
int status,i;
if(fork()= =0){
printf(“This is the child process .pid =%d\n”,getpid());
exit(5);
}else{
sleep(1);
printf(“This is the parent process ,wait for child...\n”;
pid=wait(&status);
i=WEXITSTATUS(status);
printf(“child’s pid =%d .exit status=%d\n”,pid,i);
}
}
執行
This is the child process.pid=1501
This is the parent process .wait for child...
child’s pid =1501,exit status =5

範例 二

#include<iostream>

#include<unistd.h>

#include<sys/wait.h>

using namespace std;

int main(void)

{

pid_t pid;

pid =fork();

if (pid<0)

exit(0);

else if (pid == 0)

{

//如果是子進程 睡眠20秒

cout<<"children : "<<getpid()<<endl;

sleep(20);

}

else

{ cout<<"hello! i'm parent process!"<<endl;

//如果是父進程在這裡等待

pid_t pr = wait(NULL);

cout<<pr<<endl;

}

return 0;

}

waitpid(等待子進程中斷或結束)

相關函數 wait,fork

表標頭檔

#include<sys/types.h>

#include<sys/wait.h>

定義函數 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 的子進程。

參數option 可以為0 或下面的OR 組合:

WNOHANG 如果沒有任何已經結束的子進程則馬上返回,不予以

等待。

WUNTRACED 如果子進程進入暫停執行情況則馬上返回,但結束

狀態不予以理會。

子進程的結束狀態返回後存於status,底下有幾個宏可判別結束情

況:

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

WEXITSTATUS(status)取得子進程exit()返回的結束代碼,一

般會先用WIFEXITED 來判斷是否正常結束才能使用此宏。

WIFSIGNALED(status)如果子進程是因為訊號而結束則此宏值為



WTERMSIG(status) 取得子進程因訊號而中止的訊號代碼,一般

會先用WIFSIGNALED 來判斷後才使用此宏。

WIFSTOPPED(status) 如果子進程處於暫停執行情況則此宏值為

真。一般只有使用WUNTRACED 時才會有此情況。

WSTOPSIG(status) 取得引發子進程暫停訊號代碼,一般會先

用WIFSTOPPED 來判斷後才使用此宏。

傳回值

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

-1。失敗原因存於errno 中。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.