Linux-IPC技术的选择

Linux-IPC技术的选择,c,linux,ipc,C,Linux,Ipc,我正在构建一个应用程序,它接受一个可执行文件作为输入,执行该文件,并跟踪动态内存分配,以帮助跟踪内存错误 读取可执行文件的名称后,我创建了一个子进程,将可执行文件与我的模块(包括我的malloc函数族版本)链接,并执行用户提供的可执行文件。父进程将由一个GUI(使用QT框架)组成,我希望在其中显示警告/错误/分配数量 我需要将mallocs/free的数量和一系列警告消息实时传递给父进程。在用户应用程序完成执行后,我希望显示内存泄漏的数量。(我已经在我链接的共享库中处理了所有需要的后端编码) 实

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

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

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

实时:

我想到了两种不同的方法来传达这些信息

  • 子进程将写入2个管道(1个用于写入是否发生分配/释放,另一个用于写入单个整数以表示警告消息)
  • 我认为只需发送一个信号来表示是否发生了分配。还为每个警告消息创建信号。我将把这些映射到父进程中的实际警告(字符串)
  • 信号版本是否与使用管道一样有效?可行吗?有没有更好的选择,因为我很关心效率:)

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

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


    感谢您的时间

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

    信号绝对不是实现这一点的方法。一般来说,尽可能避免使用信号


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

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

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


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

    我敢问,你这样做是为了什么?(只是感兴趣)这是我的本科毕业设计,我可以把它标记为家庭作业吗?不,我只是好奇,如果你把它标记为家庭作业,你真的只会得到一堆参考资料,而不是你可能真正需要的代码片段的帮助。