我安装了一个 SIGSEV 和 SIGABRT 信号处理程序,它派生了一个子进程: 1. 使用 SIGSTOP 停止其父进程。2. 在父进程上调用 gdb 以收集崩溃诊断信息。
问题是,由于 ptmalloc 安装了 pthread_atfork 处理程序, fork 在 glibc 上不是异步信号安全的。现在我的信号处理程序有可能冻结,因为 fork() 尝试分配内存,这反过来可能会抓住一个已经锁定的互斥锁。
我想通过直接调用 fork 系统调用、绕过任何 libc 包装器并因此绕过任何 atfork 处理程序来解决这个问题。我怎么做?以下代码适用于 Linux,但似乎不适用于 OS X。它总是返回子 PID,从不为 0,还是应该这样做?我也不确定我是否正确捕获了返回值,因为定义是int syscall(...)
但是 fork 返回一个整数类型pid_t
。
pid = syscall(SYS_fork);
我的应用程序可以在许多平台上运行,包括 Linux 和 OS X。
编辑:修复错字:s/线程安全/异步信号安全/。