2012-07-02 35 views
2

我安装了一个SIGSEV和SIGABRT信号处理程序,它分派一个子进程: 1.用SIGSTOP停止它的父进程。 2.在父进程上调用gdb来收集崩溃诊断信息。如何直接调用fork(),绕过libc?

问题是,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.

EDIT运行S /线程安全/异步信号安全/。

+1

对不起,但如果你的应用程序应该在许多平台上运行,我看不出如何调用依赖于平台的'系统调用() '会帮你轻松点... –

+0

为什么不写一个'fork()'的封装器来锁定/解锁调用周围的互斥锁,因此它变得线程安全? – Shahbaz

+1

据我了解你链接的错误,如果你从信号处理程序调用'fork',而不是从不同的线程调用相关。也就是说,'fork()'不是异步信号安全的。没有提到它不是线程安全的。你有这个bug吗?或者你只是特别小心? – rodrigo

回答

0

在Linux上,如果你只是想自动开火软件核心调试器倾销的信号,你可以让你的核心转储管道到一些脚本,根据core(5)你只需要一个|(管道字符随后启动coredump_filter通过命令)。

这一招可避免任何额外的编程(除您为脚本)