创建子进程的目的:执行代码。执行完代码后正常退出exit(),括号内为退出码,退出时需要捕捉退出码,来判断子进程工作完成的情况,来返回给父进程
收集子进程的退出状态,调用函数
pid_t wait(int *wstatus);
pid_t waitpid(pid_t pid, int *wstatus, int options);
如果其所有子进程都还在运行,则阻塞(父进程)。
如果一个子进程已经终止,正等待父进程获取其终止状态,则取得该子进程的种植状态立即返回。
如果它没有任何子进程,则立即出错返回。
status参数:
是一个整型数指针
非空:子进程退出状态放在它所指向的地址中
空:不关心推出状态
检测退出状态:如果正常退出,调用WEXITSTATUS(status),取子进程传送给exit,_exit或_Exit参数的低8位
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main()
{
pid_t pid;
pid = fork();
int data;
int cnt = 0;
int status = 8;
if(pid > 0){
wait(&status); //阻塞父进程的执行,直到接收到子进程的退出状态
printf("child quit,child status = %d\n",WEXITSTATUS(status));//检测子进程传给父进程的低8位
while(1){
printf("cnt=%d\n",cnt);
printf("this is father pid = %d",getpid());
sleep(1);
}
}
else if(pid == 0){
while(1){
printf("thie is child pid = %d\n",getpid());
sleep(1);
cnt++;
if(cnt == 3){
exit(3);
}
}
}
return 0;
}
孤儿进程:
父进程如果不等待子进程退出,在子进程之前就结束了自己的“生命“,此时子进程叫做孤儿进程。Linux避免系统存在过多的孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程