如何绕过libc直接调用fork()?

时间:2012-07-02 21:50:26

标签: linux posix fork

我安装了一个SIGSEV和SIGABRT信号处理程序,它处理子进程: 1.使用SIGSTOP停止其父进程。 2.在父进程上调用gdb以收集崩溃诊断信息。

问题是,fork is not async signal safe on glibc感谢ptmalloc安装pthread_atfork处理程序。现在我的信号处理程序有可能冻结,因为fork()尝试分配内存,这反过来可能会获取已经锁定的互斥锁。

我想通过直接调用fork系统调用来解决这个问题,绕过任何libc包装器,从而绕过任何atfork处理程序。我怎么做?以下代码适用于Linux,但似乎不适用于OS X.它总是返回子PID,从不返回0,或者是否应该这样做?我也不确定我是否正确捕获返回值,因为定义是int syscall(...)但fork返回类型为pid_t的整数。

pid = syscall(SYS_fork);

我的应用程序可在许多平台上运行,包括Linux和OS X.

编辑:修复拼写错误:s / thread safe / async signal safe /.

1 个答案:

答案 0 :(得分:0)

在Linux上,如果你只是想在软件核心转储信号上自动触发调试器,你可以将核心转储管道转换成某个脚本,根据core(5)你需要启动coredump_filter使用|(管道符后跟命令)。

这个技巧避免了任何额外的编程(除了你为此制作的脚本)