linux之waitpid函数
waitpid函数:成功:返回清理掉的子进程 ID;失败:-1(无子进程)
原型:pid_t waitpid(pid_t pid, int *wstatus, int options);
a.作用同 wait,但可指定 pid 进程清理,可以不阻塞
b.参数 pid:
> 0(子进程id号) 回收指定 ID 的子进程
-1 回收任意子进程(相当于 wait)
c.如果参数3为WNOHANG,且子进程正在运行,则返回值为0
WNOHANG表示非阻塞,(轮询)
d.参数3为0,则表示阻塞
代码: loop_fork.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc,char* argv[])
{
pid_t p,q;
pid_t wpid;
int n=5,i; //默认创建5个子进程
if(argc == 2){
n = atoi(argv[1]);
}
for(i=0;i<n;i++){//出口1,父进程专用出口
p = fork();
if(p==0) break; //出口2,子进程出口,i不自增
else if(i==3)
q=p;
}
if(n==i){
sleep(n);
printf("I am parent, pid = %d\n", getpid(), getgid());
//wait(NULL);//随机回收某个子进程
//while(wait(NULL));//循环回收子进程
//waitpid(q,NULL,0);//回收第4个子进程,第3个参数 0 代表阻塞,等价于wait(NULL)
//while(waitpid(-1,NULL,0));//等价于while(wait(NULL));
do{
wpid = waitpid(-1,NULL,WNOHANG);
if(wpid>0) n--;
sleep(1);
}
while(n>0);
printf("finish\n");
//while(1);
}
else{
sleep(i);
printf("I'm %dth child, pid = %d, gpid=%d\n",
i+1, getpid(), getgid());
}
return 0;
}
结果: