【发布时间】:2014-02-28 12:33:22
【问题描述】:
我在Mac平台上使用fork创建进程,在父进程中等待子进程完成。但是waitpid 返回 -1 并且 errno 是 4 (EINTR)。
可以重现此问题的示例代码如下:
#include <iostream>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
int main(int argc, const char *argv[])
{
pid_t pid = ::fork();
if (pid == 0)
{
return 0;
}
int s = 0;
if (::waitpid(pid, &s, 0) == -1)
{
printf("The errno is :%d\n", errno); // <<<The errno is 4(EINTR) in my machine.
assert(false); // <<<<This will be hit if run in debugger.
}
return 0;
}
当我在GDB 或LLDB 中运行此代码时,assert 将始终被命中。如果不在调试器中运行,它不会返回 -1。
我认为我对 debugger 或 fork/waitpid 的工作原理有些不理解。那么谁能解释为什么会发生这种情况?
【问题讨论】:
-
如果你将它包含在你的问题中,你的 printf 的输出会更能说明问题(并用 '\n' 尾随它来刷新它。很确定它将是 EINTR;一个中断的系统打电话。
-
Seams Xcode 显示
errno值不正确,实际errno值为 4(EINTR)。我已经在这篇文章中更正了。 -
2 是
SIGINT,这也是有道理的。 -
如果返回 EINTR,
waitpid是可重新启动的。相应地构造一个循环。我不得不在我的 Mac 上做同样的事情。 -
唯一一个公众反响非常好的主题帖子是:stackoverflow.com/a/2708512/715269
标签: c macos posix fork waitpid