Linux下c语言进程通讯——wait()/wait(&status)/WIFEXITED(status)和exit()之间的关系

wait()函数定义

1
2
3
4
#include <sys/types.h> 
#include <sys/wait.h>
pid_t wait(int *status)
// 参数status用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。但如果我们对这个子进程是如何死掉的毫不在意,只想把这个僵尸进程消灭掉,(事实上绝大多数情况下,我们都会这样想),我们就可以设定这个参数为NULL,如pid=wait(NULL),返回给pid的值就是子进程的id

WIFEXITED(status)/WEXITSTATUS(status)

当子进程正常结束时,WIFEXITED(status) 返回非0值;当子进程异常结束时,WIFEXITED(status) 返回0值

WEXITSTATUS(status)在WIFEXITED(status)为非0时可以用来获取exit()中的参数即返回给父进程的值,如果子进程调用exit(5)退出,WEXITSTATUS(status)就会返回5;如果进程不是正常退出的,也就是说,WIFEXITED返回0

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
int status;
pid_t pc,pr;
pc=fork();
if(pc<0)
printf("error ocurred!\n");
else if(pc==0){
printf("This is child process with pid of %d.\n",getpid());
exit(5);
}
else{
pr=wait(&status);
if(WIFEXITED(status)){
printf("the child process %d exit normally.\n",pr);
printf("WIFEXITED(status) is %d.\n",WIFEXITED(status));
printf("WEXITSTATUS(status) is %d.\n",WEXITSTATUS(status));
}
else
printf("the child process %d exit abnormally.\n",pr);
}
}

运行后截图


Linux下c语言进程通讯——wait()/wait(&status)/WIFEXITED(status)和exit()之间的关系
https://blog.zhuanjie.ltd/2021/11/02/linux-wait-waitstatus-wifexitedstatus-exit/
作者
转接
发布于
2021年11月2日
许可协议