我安装了一个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 /.
答案 0 :(得分:0)
在Linux上,如果你只是想在软件核心转储信号上自动触发调试器,你可以将核心转储管道转换成某个脚本,根据core(5)你需要启动coredump_filter
使用|
(管道符后跟命令)。
这个技巧避免了任何额外的编程(除了你为此制作的脚本)