父进程等待子进程的退出并收集子进程退出状态:
程序的退出我们可以分为两种,异常退出,正常退出。正常退出即程序完成,有一个程序的结束代码,例如exit;那么异常退出的可能是哪些呢?人为杀死,abort……
子进程退出不被收集会变成僵尸状态:
当子进程结束之后父进程任然在运行,这时候我们查看子进程状态
这个时候我们可以看到我们的进程newpro中,上面父进程(pid=3279)还在运行,而下面结束的子进程(pid=3280)却还在,虽然他“死了”,Z+代表的zombie也就是僵尸
我们需要学一个函数wait,我们使用man 命令去查看如何使用:
话不多说我们来看一下代码来结合比较好理解如何使用:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
int times;
times==0;
pid_t pid;
pid=vfork();
if(pid>0)
{
wait(NULL); //改变得地方在这
while(1){
printf("this is father pid,pid=%d\n",getpid());
sleep(1);
}
}
if(pid==0)
{
while(1){
printf("this is child pid,pid=%d\n",getpid());
sleep(1);
times++;
if(times>3){exit(0);break;}
}
}
return 0;
}
再看我们的后台,就没僵尸进程了不会给服务器添加杂程序的冗余
那么如何收集退出状态呢?
我们就这么写代码:
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
int main()
{
int status =10;
pid_t pid;
pid=vfork();
if(pid>0)
{
wait(&status);
printf("child project is end,father project is begin, status=%d\n",status);
while(1){
printf("this is father pid,pid=%d\n",getpid());
sleep(1);
}
}
else if(pid==0)
{
while(1){
printf("this is child pid,pid=%d\n",getpid());
sleep(1);
exit(0);
}
}
return 0;
}
我们来看看运行结果:
status=0即子程序结束开始父进程!