gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:11:33 25 4
gpt4 key购买 nike

我安装了一个 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/。

最佳答案

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

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

关于linux - 如何绕过 libc 直接调用 fork()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11301681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com