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

Linux 如何绕过libc直接调用fork()?,linux,posix,fork,Linux,Posix,Fork,我安装了一个SIGSEV和SIGABRT信号处理程序,它派生一个子进程: 1.使用SIGSTOP停止其父进程。 2.调用父进程上的gdb以收集崩溃诊断 问题是,多亏了ptmalloc安装了pthread_atfork处理程序。现在我的信号处理程序有可能冻结,因为fork()试图分配内存,而内存又可能会获取一个已经锁定的互斥锁 我想通过直接调用fork系统调用来解决这个问题,绕过任何libc包装器,从而绕过任何atfork处理程序。我该怎么做?下面的代码在Linux上工作,但在OSX上似乎不起作用

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

问题是,多亏了ptmalloc安装了pthread_atfork处理程序。现在我的信号处理程序有可能冻结,因为fork()试图分配内存,而内存又可能会获取一个已经锁定的互斥锁

我想通过直接调用fork系统调用来解决这个问题,绕过任何libc包装器,从而绕过任何atfork处理程序。我该怎么做?下面的代码在Linux上工作,但在OSX上似乎不起作用。它总是返回子PID,而不是0,或者它应该这样做吗?我也不确定是否正确捕获了返回值,因为定义是
intsyscall(…)
,但fork返回类型为
pid\t
的整数

pid = syscall(SYS_fork);
我的应用程序在很多平台上运行,包括Linux和OS X


编辑:修复打字错误:s/thread-safe/async-signal-safe/

在Linux上,如果您只想对软件内核转储信号自动启动调试器,您可以将内核转储管道化为一些脚本,只需使用
(管道字符后跟命令)启动
coredump\u过滤器即可


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

在Linux上,如果你只想对软件内核转储信号自动启动一个调试器,你可以将内核转储管道化到一些脚本中,根据你只需要用
(管道字符后跟命令)


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

对不起,但是如果您的应用程序应该在许多平台上运行,我看不出调用依赖于平台的
syscall()
对您有什么帮助……为什么不为
fork()编写一个包装器呢
锁定/解锁调用周围的互斥锁,使其成为线程安全的?据我所知,如果从信号处理程序调用
fork
,而不是从不同的线程调用,这是相关的。也就是说,
fork()
不是异步信号安全的。没有提到它不是线程安全的。你有这个错误吗?或者你只是特别小心吗?@FrédéricHamidi:我可以只使用#ifdefs。@Shahbaz:我不能,我没有访问ptmalloc的互斥锁的权限。还有一个输入错误:我是指异步信号安全的,不是线程安全的。对不起,如果你的应用程序是线程安全的话d要在许多平台上运行,我看不出调用依赖于平台的
syscall()
对您有什么帮助……为什么不为
fork()编写一个包装器呢
锁定/解锁调用周围的互斥锁,使其成为线程安全的?据我所知,如果从信号处理程序调用
fork
,而不是从不同的线程调用,这是相关的。也就是说,
fork()
不是异步信号安全的。没有提到它不是线程安全的。你有这个错误吗?或者你只是特别小心?@FrédéricHamidi:我可以使用#ifdefs。@Shahbaz:我不能,我没有访问ptmalloc的互斥体的权限。还有一个错误:我是指异步信号安全的,不是线程安全的。