萬盛學電腦網

 萬盛學電腦網 >> 服務器教程 >> linux下的進程等待

linux下的進程等待

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

  表頭文件 #include #include 定義函數 pid_t wait (int * status); 函數說明: wait()會暫時停止目前進程的執行,直到有信號來到或子進程結束。 如果在調用 wait()時子進程已經結束,則 wait()會立即返回子進程結束狀態值。 子進程的結束狀態值會由參數 status 返回,而子進程的進程識別碼也會一起返回。 如果不在意結束狀態值,則參數 status 可以設成 NULL。 子進程的結束狀態值請參考 waitpid( ) 如果執行成功則返回子進程識別碼(PID) ,如果有錯誤發生則返回返回值-1。失敗原因存於 errno 中。 pid_t pid1; int status=0; i=wait(&status); i返回的是子進程的識別碼;PID status中存的是子進程的結束狀態;可用WEXITSTATUS(status)得到子進程的exit(3)的狀態,那麼就是3; waitpid(等待子進程中斷或結束) 表頭文件 #include #include 定義函數 pid_t waitpid(pid_t pid,int * status,int options); 函數說明: waitpid()會暫時停止目前進程的執行,直到有信號來到或子進程結束。 如果在調用 wait()時子進程已經結束,則 wait()會立即返回子進程結束狀態值。 子進程的結束狀態值會由參數 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 中。

  oot@wl-MS-7673:/home/wl/桌面/c++# cat -n wait.cpp

  1 #include

  2 #include

  3 #include

  4 #include

  5 #include

  6 #include

  7 #include

  8

  9 /*

  10 * 程序入口

  11 * */

  12 int main(void)

  13 {

  14 pid_t child;

  15

  16 /* 創建子進程 */

  17 if((child=fork())==-1)

  18 {

  19 printf("Fork Error n" );

  20 exit(1);

  21 }

  22 else

  23 {

  24 if(child==0) // 子進程

  25 {

  26 printf("the child process is runn");

  27 sleep(1); //子進程睡眠一秒,但並沒有去運行父進程

  28 printf("I am the child: %dn", getpid());

  29 exit(0);

  30 }

  31 else //父進程

  32 {

  33 wait(NULL); //等到子進程退出,父進程才會運行

  34 printf("the father process is runn");

  35 printf("I am the father:%dn",getpid());

  36 return 0;

  37 }

  38 }

  39 }

  40

  41

  root@wl-MS-7673:/home/wl/桌面/c++# g++ wait.cpp -o wait

  root@wl-MS-7673:/home/wl/桌面/c++# ./wait

  the child process is run

  I am the child: 19742

  the father process is run

  I am the father:19741

  root@wl-MS-7673:/home/wl/桌面/c++# ./wait

  本例子中,父進程等待子進程結束後才執行。~

copyright © 萬盛學電腦網 all rights reserved