wait和waitpid函數

來源:http://hohahohayo.blog.163.com/blog/static/120816010200971210230362/ide

wait(等待子進程中斷或結束)
表頭文件
     #include<sys/types.h>
     #include<sys/wait.h>
  定義函數 pid_t wait (int * status);
  函數說明:
      wait()會暫時中止目前進程的執行,直到有信號來到或子進程結束。函數

      若是在調用 wait()時子進程已經結束,則 wait()會當即返回子進程結束狀態值。
      子進程的結束狀態值會由參數 status 返回,而子進程的進程識別碼也會一塊兒返回。
      若是不在乎結束狀態值,則參數 status 能夠設成 NULL。
      子進程的結束狀態值請參考 waitpid( )     
    若是執行成功則返回子進程識別碼(PID) ,若是有錯誤發生則返回返回值-1。失敗緣由存於 errno 中。

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 中。
    
 /******
*    waitpid.c - Simple wait usage
*********/

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>

int main( void )
{
    pid_t childpid;
    int status;
    
    childpid = fork();
    
    if ( -1 == childpid )
    {
        perror( "fork()" );
        exit( EXIT_FAILURE );
    }
    else if ( 0 == childpid )
    {
        puts( "In child process" );
        sleep( 3 );//讓子進程睡眠3秒,看看父進程的行爲
        printf("\tchild pid = %d\n", getpid());
        printf("\tchild ppid = %d\n", getppid());
        exit(EXIT_SUCCESS);
    }
    else 
    {
        waitpid( childpid, &status, 0 );
        puts( "in parent" );
        printf( "\tparent pid = %d\n", getpid() );
        printf( "\tparent ppid = %d\n", getppid()  );
        printf( "\tchild process exited with status %d \n", status );
    }
    exit(EXIT_SUCCESS);
}
View Code

[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
in parent
        parent pid = 4481
        parent ppid = 4379
        child process exited with status 1331234400 
[root@localhost src]#   child pid = 4482
        child ppid = 1

子進程尚未退出,父進程已經退出了。spa

   
相關文章
相關標籤/搜索