可以比 IPC 或套接字更直接地在进程之间进行通信吗?

Posted

技术标签:

【中文标题】可以比 IPC 或套接字更直接地在进程之间进行通信吗?【英文标题】:Possible to communicate between processes more directly than IPC or sockets? 【发布时间】:2013-02-11 21:15:54 【问题描述】:

我有 2 个进程,我希望其中一个进程以高数据吞吐量与另一个进程通信。我已经尝试过 IPC(特别是 boost::iterprocess)和套接字,但它们的性能/吞吐量太慢而无法使用。

我的后备选项是启动第二个进程作为第一个进程的附加子进程(加载其 dll,创建“工具”等),这具有最佳性能,因为它们在技术上是相同的进程,传递数据只是用DLL调用接口函数。

我正在寻找方法来避免这样做,但仍然具有这种程度的性能。是否可以设置一个 2 个进程可以加载的 DLL 并以某种方式共享内存空间? IPC 和套接字是这里唯一的选择吗?

【问题讨论】:

【参考方案1】:

在 Windows 上,您可以使用命名管道。在本地使用时,它们曾经被认为比套接字更有效。然而,它们已经过时了。你可以在这里了解更多microsoft docs on named pipes

【讨论】:

【参考方案2】:

您的问题中的“IPC”是什么?套接字、管道、共享内存都是进行 IPC 的方法。是的,您可以在 Windows、Linux 和其他通用系统上使用共享内存。在 C++ 中,您可以将内存块声明为共享(至少在 Windows 上),也可以调用内存映射文件 (MMF) 函数。在 Linux 和 BSD 上,您也使用内存映射文件函数。 除了将第二个进程转换为 DLL 之外,MMF 是最快的方法。命名管道和其他任何东西都比较慢。

【讨论】:

【参考方案3】:

对于本地进程,您可以使用共享文件。如果你对文件进行内存映射,它会快得多。

【讨论】:

以上是关于可以比 IPC 或套接字更直接地在进程之间进行通信吗?的主要内容,如果未能解决你的问题,请参考以下文章

IPC:Qt 和 MONO 进程之间的通信(在 linux 上)

进程和线程之间的通信

操作系统之 进程间通信的方式都有哪些

IPC之套接字

在 Windows 服务和窗体应用程序之间使用套接字进行进程间通信

进程间通信(IPC)——Unix域套接字 VS 网络套接字