#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的参数