waitpid

waitpid

waitpid()會暫時停止目前進程的執行,直到有信號來到或子進程結束。

基本介紹

  • 中文名:waitpid
  • 定義:數學函式
  • 釋義:函式名詞
  • 說明:pid<-1
表頭檔案,函式說明,示例代碼,

表頭檔案

#include<sys/types.h>
#include<sys/wait.h>
定義函式 pid_t waitpid(pid_t pid,int * status,int options);

函式說明

如果在調用 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 中。

示例代碼

/******* 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 ( childpid < 0 ){    perror( "fork()" );    exit( EXIT_FAILURE );}else if ( childpid == 0 ){    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);}
[root@localhost src]# gcc waitpid.c[root@localhost src]# ./a.outIn child processchild pid = 4469child ppid = 4468in parentparent pid = 4468parent ppid = 4379child process exited with status 0[root@localhost src]#
如果將上面“waitpid( childpid, &status, 0 );”行注釋掉,程式執行效果如下:
[root@localhost src]# ./a.outIn child processin parentparent pid = 4481parent ppid = 4379child process exited with status1[root@localhost src]# child pid = 4482child ppid = 1
子進程還沒有退出,父進程已經退出了。

相關詞條

熱門詞條

聯絡我們