c - 父进程如何将子进程退出码转换为状态码?
问题描述
当我运行以下代码时(省略标题和主条目)
void fork11()
{
pid_t pid[N];
int i;
int child_status;
for (i = 0; i < N; i++)
if ((pid[i] = fork()) == 0)
exit(100+i); /* Child */
for (i = N-1; i >= 0; i--) {
pid_t wpid = waitpid(pid[i], &child_status, 0);
if (WIFEXITED(child_status)) {
printf("Child %d terminated with exit status %d\n", wpid, WEXITSTATUS(child_status));
printf("child_status: %d\n", child_status);
} else {
printf("Child %d terminate abnormally\n", wpid);
}
}
}
结果是
Child 5126 terminated with exit status 104
child_status: 26624
Child 5125 terminated with exit status 103
child_status: 26368
Child 5124 terminated with exit status 102
child_status: 26112
Child 5123 terminated with exit status 101
child_status: 25856
Child 5122 terminated with exit status 100
child_status: 25600
经过一番挖掘,我发现WEXITSTATUS
是一个简单的宏
#define WEXITSTATUS(x) ((_W_INT(x) >> 8) & 0x000000ff)
以子进程 5126 为例,waitpid
转换104
为26624=0x6800
,WEXITSTATUS
转换26624
回104=0x68
,我试图查找源代码,waitpid
但最终得到了一些我无法理解的内核函数......谁能解释一下如何waitpid
转换退出代码? 在上面的例子中看起来相当简单,但我认为它远不止于此,谢谢!
解决方案
当进程退出时,传递给exit()
函数的返回值用作int
传递给等待它的任何进程的实际(4 个字节)的参数。除了此状态代码的 8 位之外,还传递了更多信息。
例如,在实际(最终)退出代码(整个 4 个字节)中,指定了进程是否收到信号。
如此处所见:WEXITSTATUS
这由状态参数的最低有效 8 位组成,子进程在调用中指定
exit(3)
...
这意味着进程不能以需要超过 8 位的代码退出。
推荐阅读
- kubernetes - 当我们将 Statefulset 升级到更新的镜像版本时会发生什么?
- python - Python 3:如何在两个日期范围内获得工作日
- javascript - 对整个网页的不同场景使用通用模态
- selenium - 无法将 selenium 网格与 Aws Ec2 实例连接
- javascript - 如何在 Discord.js 中制作 DM 提示?
- python - 在我的 sbmissions 页面中,用户必须获取该特定用户添加的数据
- angular - 无法第二次触发事件
- javascript - React Lazy 做 Switch 没用?
- git - 如何在其基础分支基于主分支后重新设置分支
- azure - 在更改 powershell 中的 azure 资源之前,我是否应该使用“获取”进行检查