回收单个子进程
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/wait.h>
int main()
{
pid_t pid,wpid;
int statu;
pid=fork();
if(pid==0)
{
printf("---child,my parent= %d,going to sleep 30s\n",getppid());
sleep(30);
printf("----------child die------------\n");
exit(76);
}
else if(pid>0)
{
wpid= wait(&statu);
if(wpid==-1)
{
perror("wait error");
exit(1);
}
if(WIFEXITED(statu))
{
printf("child exit with %d\n",WEXITSTATUS(statu));
}
if(WIFSIGNALED(statu))
{
printf("child killed by %d\n ",WTERMSIG(statu));
}
while(1)
{
printf("I'm parent,pid=%d,myson=%d\n",getpid(),pid);
sleep(1);
}
}
else
{
perror("fork");
return 1;
}
return 0;
}
回收多个子进程
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/wait.h>
int main(int argc,char *argv[])
{
int n=5,i;
pid_t p,q;
pid_t wpid;
if(argc==2)
{
n=atoi(argv[1]);
}
for(i=0;i<n;i++)
{
p=fork();
if(p==0)
break;
else if(i==3)
q=p;
}
if(n==i)
{
sleep(n);
printf("I am parent,pid= %d\n ",getpid());
do{
wpid=waitpid(-1,NULL,WNOHANG);
if(wpid>0)
n--;
}while(n>0);
printf("wait finish!");
}
else
{
sleep(i);
printf("I'm %dth child ,pid= %d,ppid=%d\n",i+1,getpid(),getppid());
}
return 0;
}