歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux下的進程等待(wait和waitpid)

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

表頭文件
    #include<sys/types.h>
    #include<sys/wait.h>
定義函數 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<sys/types.h>
      #include<sys/wait.h>
定義函數  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 中。

[email protected]:/home/linuxidc/桌面/c++# cat -n wait.cpp
    1 #include <unistd.h>
    2 #include <sys/types.h>
    3 #include <sys/wait.h>
    4 #include <stdio.h>
    5 #include <stdlib.h>
    6 #include <errno.h>
    7 #include <math.h>
    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 run\n");
    27    sleep(1);  //子進程睡眠一秒,但並沒有去運行父進程
    28    printf("I am the child: %d\n", getpid());
    29    exit(0);
    30   }
    31   else        //父進程
    32   {
    33    wait(NULL); //等到子進程退出,父進程才會運行
    34    printf("the father process is run\n");
    35    printf("I am the father:%d\n",getpid());
    36    return 0;
    37   }
    38  }
    39 } 
    40 
    41 
[email protected]:/home/linuxidc/桌面/c++# g++ wait.cpp -o wait
[email protected]:/home/linuxidc/桌面/c++# ./wait
the child process is run
I am the child: 19742
the father process is run
I am the father:19741
[email protected]:/home/linuxidc/桌面/c++# ./wait

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

Copyright © Linux教程網 All Rights Reserved