#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *statusPtr, int options);
現在要知道調用wait
或waitpid
的進程可能會產生甚么情況:
如果進程由于接收到SIGCHLD
信號而調用wait
,則可期望wait
會立即返回。但是如果在任意時刻調用wait
則進程可能會阻塞。
#include "apue.h"
#include <sys/wait.h>
int main(void)
{
pid_t pid1,pid2;
printf("before fork
");
if((pid1=fork())<0){
printf("fork error");
}else if(pid1==0){
printf("child process 'spid=%d
",getpid());
sleep(3);
}else{
pid2=wait(NULL);
printf("wait process 's pid=%d
",pid2);
}
exit(0);
}
結果:
當程序運行的時候明顯的可以看到在輸出最后1行 的時候等待了3秒鐘。也就是父進程等待子進程的結束。父進程才能捕捉子進程,然后得到wait
要得到的結果。
參數status
是1個整型指針。如果參數status
的值不是NULL
,wait
就會把子進程退出時的狀態取出并存入其中,這是1個整數值(int
),指出了子進程是正常退出還是被非正常結束的(1個進程也能夠被其他進程用信號結束),和正常結束時的返回值,或被哪個信號結束的等信息。由于這些信息被寄存在1個整數的不同2進制位中,所以用常規的方法讀取會非常麻煩,人們就設計了1套專門的宏(macro
)來完成這項工作,下面我們來學習1下其中最經常使用的兩個:
WIFEXITED(status)
這個宏用來指出子進程是不是為正常退出的,如果是,它會返回1個非零值。
(請注意,雖然名字1樣,這里的參數status
其實不同于wait
唯1的參數