我有这个简单的程序,可以创建一个立即调用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);
}
答案 0 :(得分:4)
你有孩子和父母的逻辑向后。父母正在立即退出,孩子正在呼叫wait
。由于孩子没有孩子,wait
正在返回错误(并且没有触及status
),因为孩子没有孩子(ECHILD
),那么您正在测试(未初始化)值status
并对其采取行动,导致未定义的行为。
变化:
else if (pid == 0)
为:
else if (pid > 0)
它应该按预期工作。