Linux IPC 技术的选择

Posted

技术标签:

【中文标题】Linux IPC 技术的选择【英文标题】:Choice of Linux IPC technique 【发布时间】:2011-03-18 19:26:40 【问题描述】:

我正在构建一个应用程序,它输入一个可执行文件,执行它并跟踪动态内存分配等,以帮助跟踪内存错误。

在读取可执行文件的名称后,我创建了一个子进程,将可执行文件与我的模块(包括我的 malloc 系列函数)链接并执行用户提供的可执行文件。父进程将包含一个 GUI(使用 QT 框架),我想在其中显示警告/错误/分配数。

我需要将 malloc/frees 的数量和一系列警告消息实时传达给父进程。用户应用程序完成执行后,我希望显示内存泄漏的数量。 (我已经在我链接的共享库中处理了所有需要的后端编码)。

实时:

我想到了 2 种不同的方法来传达此信息。

    子进程将写入 2 个管道(1 个用于写入是否发生分配/释放,另一个用于写入单个整数以表示警告消息)。 我只是简单地发送一个信号来表示是否发生了分配。还为每个警告消息创建信号。我会将这些映射到父进程中的实际警告(字符串)。

信号版本是否与使用管道一样有效?可行吗?有没有更好的选择,因为我很关心效率:)

用户的应用程序完成执行后:

我需要在这里发送我用来跟踪内存泄漏的整个数据结构。这可能非常大,所以我不确定哪种 IPC 方法最有效。

感谢您的宝贵时间

【问题讨论】:

我敢问,你这样做是为了什么? (只是感兴趣) 这是我本科最后一年的项目,我应该把它标记为家庭作业吗? 不,我只是好奇,如果你把它标记为家庭作业,你真的只会让人们给你一堵参考墙,而不是你可能真正寻找的代码 sn-p 的帮助。跨度> 【参考方案1】:

我建议使用 unix 域套接字,它比管道更灵活一点,可以配置为数据报模式,这样您就不必寻找消息边界,并且以后可以轻松移动到网络接口。

【讨论】:

【参考方案2】:

信号绝对不是这样做的方法。一般来说,最好尽可能避免使用信号。

管道解决方案很好。您也可以使用共享内存,但这更容易受到目标应用程序意外损坏的影响。

【讨论】:

【参考方案3】:

我建议将共享内存和套接字结合使用。有一个共享内存区域,比如 1MB,并在该缓冲区中以某种标准格式记录所有信息。如果/当缓冲区填满或进程终止时,您通过套接字向阅读器发送消息。阅读器确认后,您可以清除缓冲区并继续。

要回答 caf 对目标应用程序损坏的担忧,只需使用mprotect 系统调用从共享内存区域删除权限(设置PROT_NONE),然后再将控制权交给目标进程。当然,这意味着您必须在更新每个分配的日志之前设置PROT_READ|PROT_WRITE,不确定这是否是通过mprotect 调用来提高性能。

编辑:如果不是很明显,您可以拥有多个缓冲区(或一个分为 N 部分),这样您就可以立即将控制权交还给目标进程,而无需等待读者确认。此外,如果有足够的计算资源,阅读器可以根据需要随时运行,以读取当前活动的缓冲区并对用户或正在读取的任何内容执行实时更新。

【讨论】:

以上是关于Linux IPC 技术的选择的主要内容,如果未能解决你的问题,请参考以下文章

Linux 进程间通信(IPC)总结

Linux IPC 选择?

1,啥是IPC

从IPC到分布式软总线的随笔

从IPC到分布式软总线的随笔

C++跨平台:进程间通讯(IPC)的技术选型