程序员人生 网站导航

UNIX多进程 - 销毁僵尸进程 - wait()和waitpid()函数

栏目:互联网时间:2015-04-08 08:15:48
#include <sys/types.h> #include <sys/wait.h> pid_t wait(int *status); pid_t waitpid(pid_t pid, int *statusPtr, int options);

现在要知道调用waitwaitpid的进程可能会产生甚么情况:

  • 如果其所有子进程都在运行,则阻塞
  • 如果1个子进程已终止,正在等待的父进程获得到终止状态,则获得该子进程的终止状态立即返回。
  • 如果他没有任何子进程,则立即出错返回。

如果进程由于接收到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:

参数status是1个整型指针。如果参数status的值不是NULLwait就会把子进程退出时的状态取出并存入其中,这是1个整数值(int),指出了子进程是正常退出还是被非正常结束的(1个进程也能够被其他进程用信号结束),和正常结束时的返回值,或被哪个信号结束的等信息。由于这些信息被寄存在1个整数的不同2进制位中,所以用常规的方法读取会非常麻烦,人们就设计了1套专门的宏(macro)来完成这项工作,下面我们来学习1下其中最经常使用的两个:

  1. WIFEXITED(status)

这个宏用来指出子进程是不是为正常退出的,如果是,它会返回1个非零值

(请注意,虽然名字1样,这里的参数status其实不同于wait唯1的参数

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐