首页 > 解决方案 > 父进程如何将子进程退出码转换为状态码?

问题描述

当我运行以下代码时(省略标题和主条目)

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转换10426624=0x6800WEXITSTATUS转换26624104=0x68,我试图查找源代码,waitpid但最终得到了一些我无法理解的内核函数......谁能解释一下如何waitpid转换退出代码? 在上面的例子中看起来相当简单,但我认为它远不止于此,谢谢!

标签: cprocesswaitpid

解决方案


当进程退出时,传递给exit()函数的返回值用作int传递给等待它的任何进程的实际(4 个字节)的参数。除了此状态代码的 8 位之外,还传递了更多信息。

例如,在实际(最终)退出代码(整个 4 个字节)中,指定了进程是否收到信号。

如此所见:WEXITSTATUS

这由状态参数的最低有效 8 位组成,子进程在调用中指定exit(3)...

这意味着进程不能以需要超过 8 位的代码退出。


推荐阅读