【发布时间】:2013-12-31 13:48:33
【问题描述】:
我在 fork 101 失败。我希望这会 fork 一个子进程,并输出子进程和父进程 printfs:
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 上。
【问题讨论】:
-
孩子不发送SIGCHLD吗?也许屏蔽那个信号?
-
很奇怪,它可以在我的 Linux 机器上运行。我对 OSX 不太了解...它是否具有某种沙盒功能或需要特殊的应用程序权限才能执行
fork()? -
在 OSX 的近亲 FreeBSD 上运行良好。
-
我没有在任何地方明确使用 SIGCHLD,但我正在使用 setjmp(),这可能是相关的吗?
-
wpid在waitpid()之后的值是多少?如果它不是-1,那么您无权查看errno。有关相关场景,请参阅errnoset in child process afterfork()in Mac OS X。