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

标签 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 的工作原理,我有一些不明白的地方。那么谁能解释为什么会这样?

最佳答案

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

关于c - 为什么 waitpid 在调试器中运行时返回 -1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21554195/

相关文章:

c - 程序C计算奇数位总数

c - PathFindExtensionW 始终返回 "."而不是完整扩展名

objective-c - 从加载的网页中获取文本字段信息 - Mac OS X 开发

image - Fortran 77 符合 POSIX 规范吗? - 写入二进制文件

c - 如何在 C 中将 10131520 转换为 Unix 纪元时间?

c - C中矩阵的段错误

c - 段错误(核心转储)pthread

windows - 是否可以使用 Go 编译器为其他操作系统分发可执行文件?

macos - Mac OSX : Using dtruss?

c - PTHREAD_PRIO_INHERIT 和 PTHREAD_PRIO_PROTECT 有什么区别?