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

C 为什么WIFEXITED在子进程退出后返回false?,c,fork,wait,C,Fork,Wait,我有一个简单的程序,它创建了一个子进程,立即调用exit()。因此,在父进程中,我期望WIFEXITED(status)评估为true,但事实并非如此。相反,WIFSTOPPED(status)计算为true,并打印“stopped”。有人能解释我为什么会有这种行为吗?我在OSX上运行,并使用gcc进行编译。谢谢 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <sy

我有一个简单的程序,它创建了一个子进程,立即调用
exit()
。因此,在父进程中,我期望
WIFEXITED(status)
评估为
true
,但事实并非如此。相反,
WIFSTOPPED(status)
计算为
true
,并打印“stopped”。有人能解释我为什么会有这种行为吗?我在OSX上运行,并使用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);
}
#包括
#包括
#包括
#包括
内部主(空)
{
int-pid;
智力状态;
pid=fork();
if(pid<0)
printf(“fork失败\n”);
否则如果(pid==0)
{
等待(&状态);
如果(妻子退出(状态))
printf(“已退出\n”);
否则如果(WIFSTOPED(状态))
printf(“已停止\n”);
}
其他的
出口(0);
返回(0);
}

您拥有向后的子级和父级逻辑。父节点立即退出,子节点正在调用
等待
。由于该子项没有子项,
wait
将返回错误(并且不接触
状态
),因为该子项没有子项(
ECHILD
),然后您将测试
状态
的(未初始化)值并对其执行操作,从而导致未定义的行为

更改:

else if (pid == 0)
致:


它应该按预期的那样工作。

您拥有子对象和父对象的向后逻辑。父节点立即退出,子节点正在调用
等待
。由于该子项没有子项,
wait
将返回错误(并且不接触
状态
),因为该子项没有子项(
ECHILD
),然后您将测试
状态
的(未初始化)值并对其执行操作,从而导致未定义的行为

更改:

else if (pid == 0)
致:

它应该像预期的那样工作