【问题标题】:How does parent process convert child process exit code to status code?父进程如何将子进程退出码转换为状态码?
【发布时间】: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) &gt;&gt; 8) &amp; 0x000000ff)

以子进程 5126 为例,waitpid104 转换为26624=0x6800WEXITSTATUS26624 转换回104=0x68,我试图查找waitpid 的源代码,但最终得到一些内核函数which I can't understand...谁能解释一下waitpid如何转换退出代码?在上面的例子中看起来相当简单,但我认为它远不止于此,谢谢!

【问题讨论】:

标签: c process waitpid


【解决方案1】:

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

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

here所见WEXITSTATUS

这包含子进程在调用exit(3)...时指定的状态参数的最低有效 8 位...

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

【讨论】:

    猜你喜欢
    • 2015-02-03
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2013-08-05
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多