gpt4 book ai didi

c - Ptrace - 与子进程的通信

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:25 26 4
gpt4 key购买 nike

我想按以下方式(伪代码)使用 ptrace:

child :

    foo();
now that foo is done parent should use ptrace to change things
parent did what he wanted to do
bar();

parent :

pid = fork();
if (pid == 0)
//child
exec(child_program)
else
//parent
attach ptrace
let child run
use ptrace to modify it's data
let child continue
  1. child 应该如何与 parent 沟通它已完成 foo 并准备好进行修改? raise(SIGSTOP) 也许吧?

  2. parent 应该如何等待 child 运行foo

我认为我们可以假设在使用 pthread 之前没有发出 SIGSTOP。

最佳答案

<删除>我可能会误解它,但是是否有任何特定原因让您想要将 `ptrace` 用于看起来像 IPC(进程间通信)的东西? Linux 上的 `ptrace` *通常不适合* IPC,您不应该真正使用它来修改子进程中的数据。<删除>如果您希望您的子进程与父进程通信,有多种不同的方法可以实现上述任务(即 Unix 域套接字、管道、信号量、共享内存),我建议您在尝试使用 IPC 之前先研究一下它们`追踪`。


编辑:

您可以使用信号量让父级等待子级(请参阅 Linux 手册页中的 sem_overview)并执行您需要执行的操作。您可以使用 sem_open 创建一个命名信号量,让 child 在父级中等待它,让 child 在完成上述任务后通知信号量。

或者,让被跟踪的子进程使用断点指令,该指令将通过 SIGTRAP 停止它,让您可以等待,然后执行您需要执行的操作。我相信 GDB 使用类似的方法进行调试(修补说明)。如果您使用的是 x86,则以下代码应该可以在您的代码中发出断点指令:

asm volatile ("int3;")

我还可以建议使用 process_vm_writev 而不是 ptrace 函数来写入进程内存 (PTRACE_POKETEXT),因为它们可以批量读取/写入进程内存。

进一步引用,我想debuggers_part2_code是一个很好的例子,说明如何使用您自己的调试工具。

关于c - Ptrace - 与子进程的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36677553/

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