【发布时间】:2020-02-27 13:19:48
【问题描述】:
当我运行以下代码时(标题和主条目省略)
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 的源代码,但最终得到一些内核函数which I can't understand...谁能解释一下waitpid如何转换退出代码?在上面的例子中看起来相当简单,但我认为它远不止于此,谢谢!
【问题讨论】:
-
我有一个关于退出状态的类似问题,How to detect if shell failed to execute a command after popen call? Not to confuse with the command exit status。我的理解是进程邮件失败,进程可能会发出信号,shell可能会失败。希望您能在我链接的答案中找到一些有用的信息。
-
@ЯрославМашко 谢谢伙计,这非常有帮助,我仍然想知道除了移动位之外还有什么...
-
如果你使用 glibc,你会想看看code.woboq.org/gcc/include/bits/waitstatus.h.html
-
@ЯрославМашко 谢谢你的朋友,我也在寻找那个答案。祝你有美好的一天。
-
移位和掩码......还有什么可以?还是您在谈论其他一些流程活动?