在不相关的进程之间建立IPC

时间:2013-06-24 06:17:56

标签: c unix operating-system ipc pipe

我想将一个共享库注入一个进程(我正在使用ptrace()来执行该部分)然后能够从共享库中获取输出回到我正在编写的调试器中IPC的形式。我的直觉是使用管道,但唯一真正的要求是:

  • 我不想在文件系统上存储任何内容以方便通信,因为它只会在调试器运行时持续。
  • 我想要一个可移植的Unix解决方案(所以Unix标准的系统调用是理想的)。

我遇到的问题是,据我所知,如果我在调试器中调用pipe(),则无法将管道的“发送”端传递给目标进程,接收端反之亦然。我可以设置共享内存,但我认为这需要在某处创建一个文件,以便我可以从两个进程引用内存段。其他调试器在进程已经开始运行后附加到进程时如何捕获输出?

2 个答案:

答案 0 :(得分:0)

我认为您需要一个用于业务逻辑代码的调试系统(我的意思是应用程序)。根据我的经验,这种问题通过以下解释的系统设计来解决。 (我的经验是在C ++中,我认为同样必须对基于C的系统也有好处。)

  1. 拥有记录器系统(单独的过程)。这将包含 - 记录器管理器和日志记录代码 - 它将负责将日志转储到硬盘中。
  2. 每个应用程序实例(在Unix中运行的进程)将使用套接字与此进程通信。因此,您可以拥有自己的消息传递协议,并通过基于套接字的通信与记录器系统进行通信。
  3. 稍后,对于每个应用程序 - 都有一个可以关闭/打开日志的开关。因此,您可以使用工具 - 向此进程发送信号以打开/关闭消息记录。
  4. 在较高的层面上,这是开发日志系统的最通用方法。如果您需要任何信息 - 请对其进行评论。我会尽力回答。

答案 1 :(得分:0)

使用更好的搜索字词告诉我这个问题是这些人的重复:

最热门的答案就是我所寻找的。您可以使用Unix域套接字将文件描述符移交给其他进程。这可以从调试器到库,反之亦然,但从调试器到库可能更容易,因为调试器可以在注入库时将套接字的地址写入目标进程。

但是,一旦我将套接字的地址传递给目标进程,我不妨使用套接字本身,而不是另外使用管道。