我在fork 101方面失败了。我期望这个程序能够fork一个子进程,并输出子进程和父进程的printf语句:
pid_t fpid;
if ((fpid = fork()) < 0)
{
printf("fork: %s\n", strerror(errno));
exit(-1);
}
if (0 == fpid) // child
{
printf("\nI am the child\n");
}
else
{
printf("\nI am the parent\n");
pid_t wpid;
while ((wpid = waitpid(WAIT_ANY, NULL, 0)))
{
if (errno == ECHILD)
break;
else if (wpid < 0)
printf("wait: %s\n", strerror(errno));
}
}
然而,我得到了这个输出:
我是父进程
等待:系统调用被中断
所以我的问题是:为什么子进程没有机会运行?有没有人想过孩子们!此外,EINTR是从哪里来的?显然,这与我的第一个问题有关。
此外,当我在独立程序中运行该代码时,它能正常工作,但在我的大型程序中却不能工作;我的大型程序可能会干扰waitpid吗?
FWIW,这是在OSX 10.9上进行的。
waitpid()
执行后,wpid
的值是多少?如果不是 -1,则您无权查看errno
。请参阅fork()
在 Mac OS X 中的子进程中设置的errno
以获取相关场景。 - Jonathan Leffler