首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux IPC技术的选择

Linux IPC技术的选择
EN

Stack Overflow用户
提问于 2011-03-18 19:26:40
回答 3查看 952关注 0票数 2

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

在读取了可执行文件的名称之后,我创建了一个子进程,将可执行文件与我的模块(包括我的malloc函数族的版本)链接起来,并执行用户提供的可执行文件。父进程将由GUI (使用QT框架)组成,我希望在其中显示警告/错误/分配数量。

我需要将错误/释放的数量和一系列警告消息实时地传递给父进程。用户应用程序执行完毕后,我希望显示内存泄漏的数量。(我已经在链接所针对的共享库中处理了这方面所需的所有后端编码)。

实时:

我想出了两种不同的方法来传递这些信息。

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

信号版本和使用管道一样有效吗?这可行吗?还有更好的选择吗,因为我关心效率:)

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

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

耽误您时间,实在对不起

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-19 03:29:26

我建议将共享内存和套接字组合起来。有一个共享内存区域,例如1MB,并以某种标准格式在该缓冲区中记录所有信息。如果/当缓冲区填充或进程终止时,您将通过套接字向读取器发送消息。读取器ACK之后,您可以清除缓冲区并继续运行。

要回答caf对目标应用程序损坏的关切,只需使用护卫系统调用从共享内存区域删除权限(设置为PROT_NONE),然后才能控制目标进程。当然,这意味着您必须在更新每个分配的日志之前设置PROT_READ|PROT_WRITE,不确定这是否在mprotect调用中获得了性能上的胜利。

编辑:如果不是很明显,您可以有多个缓冲区(或一个分为N个部分),这样您就可以立即将控制传递回目标进程,而不是等待读取器到达ACK。另外,如果有足够的计算资源,读者可以按照自己的意愿运行,读取当前活动的缓冲区,并执行对用户的实时更新或任何它正在读取的内容。

票数 1
EN

Stack Overflow用户

发布于 2011-03-18 19:29:37

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

票数 3
EN

Stack Overflow用户

发布于 2011-03-19 01:03:25

信号绝对不是这么做的方法。一般来说,只要有可能,最好避免发出信号。

管状溶液很好。您也可以使用共享内存,但这将更容易受到目标应用程序意外损坏的影响。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5356887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档