为什么waitpid在调试器中运行时返回-1?

时间:2014-02-04 13:42:57

标签: c macos posix fork waitpid

我使用fork在Mac平台上创建进程,并等待子进程在父进程中完成。但是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;
}

当我在GDBLLDB中运行此代码时,assert始终会被点击。如果没有在调试器中运行,它将不会返回-1。

我认为我不了解debuggerfork/waitpid的工作原理。那么有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

调试器正在向进程发送信号。正如WhozCraig所说,这些应该通过检测EINTR并在循环中再次调用waitpid来处理。请注意,在调试器中运行 child 进程时,调试器可能会将父进程更改为调试器的PID,因此子进程上的waitpid将无法认为子进程已退出,即使它已经退出不。当调试器退出时,它会将子项的PPID恢复为原始父项的PID。