为什么WIFEXITED在子进程退出后返回false?

时间:2017-02-12 01:41:49

标签: c fork wait

我有这个简单的程序,可以创建一个立即调用exit()的子进程。所以在父进程中我期望WIFEXITED(status)评估为true,但事实并非如此。相反,WIFSTOPPED(status)评估为true并打印“已停止”。任何人都可以解释为什么我会得到这种行为?我在OS X上运行并使用gcc进行编译。谢谢!

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>

int main(void)
{
    int pid;
    int status;

    pid = fork();
    if (pid < 0)
        printf("fork failed\n");
    else if (pid == 0)
    {
        wait(&status);
        if (WIFEXITED(status))
            printf("exited\n");
        else if (WIFSTOPPED(status))
            printf("stopped\n");
    }
    else
        exit(0);

    return (0);
}

1 个答案:

答案 0 :(得分:4)

你有孩子和父母的逻辑向后。父母正在立即退出,孩子正在呼叫wait。由于孩子没有孩子,wait正在返回错误(并且没有触及status),因为孩子没有孩子(ECHILD),那么您正在测试(未初始化)值status并对其采取行动,导致未定义的行为。

变化:

else if (pid == 0)

为:

else if (pid > 0)

它应该按预期工作。