作用:
阻塞等待
回收子进程资源
查看死亡原因
子进程的死亡原因
正常死亡 WIFEXITED
如果WIFEXITED为真,使用WEXITSTATUS得到退出状态
非正常死亡 WIFSIGNALED
如果WIFSIGNALED为真,使用WTERMSIG得到是哪个信号杀死的
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
? int main(int argc,char *argv[])
{
pid_t pid = fork();
if(pid == 0)
{
printf("I am child,will die!\n");
sleep(2);
//exit(102);
return 9;
}else if(pid > 0)
{
printf("I am parent,wait for child die!\n");
int status;
pid_t wpid = wait(&status);
printf("wait ok,wpid=%d,pid=%d\n",wpid,getpid());
if(WIFEXITED(status)) {
printf("child exit wait %d\n",WEXITSTATUS(status));
}
if(WIFSIGNALED(status))
{
printf("child signal wait %d\n",WTERMSIG(status));
}
while(1){}
}
return 0;
}
pid_t waitpid(pid_t pid,int *status,int options);
pid
< -1 -组id
-1 回收任意
0 回收和调用进程组id相同组内的子进程
>0 回收指定的pid
opetions
0 于wait相同,也会阻塞
WNOHANG如果当前没有子进程退出的,会立刻返回
返回值
如果设置了WNOHANG 那么如果没有子进程堆土,返回0
如果有子进程退出,返回退出的pid
失败返回-1 (没有子进程,或者已经死完了)
pid_t pid = fork();
if(pid == 0)
{
printf("I am Child pid = %d\n",getpid());
sleep(2);
}else if(pid > 0)
{
printf("I am father pid = %d\n",getpid());
int ret;
while(waitpid(-1,NULL,WNOHANG) == 0)
{
sleep(1);
}
printf("ret = %d\n",ret);
ret = waitpid(-1,NULL,WNOHANG);
if(ret < 0)
{
perror("wait err");
}
while(1)
{
sleep(1);
}
}
linux c++(进程相关的函数 & 第三篇 子进程回收)
原文:https://www.cnblogs.com/lodger47/p/14729649.html