多个相同进程之间的 IPC 通信

Posted

技术标签:

【中文标题】多个相同进程之间的 IPC 通信【英文标题】:IPC communication between several identical processes 【发布时间】:2011-04-23 18:51:20 【问题描述】:

上下文:Linux (Ubuntu)、C

我在一个盒子上生成了几个相同的简约进程。这些流程正在建立一些网络,并且大部分时间都停留在poll(或select 或其他任何东西——我可以根据需要进行更改)。

进程生命周期由runitmultiwatch 监控(如果这改变了某些东西)。

有时,一个随机进程可能会决定它想向所有其他进程(如果它使事情变得更简单,包括它自己)发送一条消息(即一堆数据)。

此外,有时,人类操作员可能希望从命令行发送这样的消息(假设我可以根据需要编写命令行工具)——同样,发送到每个进程。

必须保证消息传递。但是,如果任何(或所有)收件人突然消失,它不应该阻止发件人(OTOH,如果他们还活着但很忙,他们最终必须收到消息。)如果收件人进程在轮询中空闲,它必须被消息唤醒。

在不增加很多复杂性的情况下,组织这种交流的最稳健的方式是什么?

注意:由于技术原因,我不能使用 POSIX 信号在进程之间进行通信。

【问题讨论】:

【参考方案1】:

我知道这个帖子很老了,认为答案可能会对那里的人有所帮助。我使用过 Kbus,发现它非常适合跨多个进程广播消息。它是一个带有用户库的 Linux 内核模块,进程需要使用该库来创建描述符。使用发布/订阅设计模式,使其成为一个解耦系统。

来源: https://github.com/kynesim/kbus

文档: https://kbus.readthedocs.io/en/latest/

西米斯

【讨论】:

【参考方案2】:

广播和可靠这两个术语有点对立,我认为您必须建立所有可靠的单播连接并自己实施“广播”。

我编写了一些集群软件,局域网上的节点需要找到彼此并建立可靠的通信 - 方案如下:

每个进程都配置相同的端口号和局域网广播地址 每个进程都将一个 tcp 监听器绑定到一个随机的本地端口 每个进程绑定到指定的本地UDP端口,监听广播 每个进程每隔几秒发送一条消息,宣布其存在、ID(例如 PID)和 TCP 端点 当一个进程发现另一个 ID 较低的进程时,它会与它建立 TCP 连接,并可选择要求提供已知对等方的列表

在此之后,每个进程都连接到其他每个进程,您可以手动实现“可靠广播”。

【讨论】:

对不起,我从主题中删除了广播这个词。我的意思是来自一个发件人的消息被传递到每个进程。如果它是通过单播或多播或低级别的广播来完成的并不重要。 @Alexander:嗯,你想做的仍然是逻辑上的广播/多播。我认为使这个可靠的唯一选择是建立这组可靠的连接。 好的,很公平。但我实际上要问的是:这种“多播”是否有更高级别的解决方案,还是我必须自己从头开始编写代码? @Alexander:我不知道有更高的级别。您可能能够找到执行此操作的库,但它足够专业,您最好自己将其编写为库。

以上是关于多个相同进程之间的 IPC 通信的主要内容,如果未能解决你的问题,请参考以下文章

进程间通信--IPC

进程间通信--IPC

进程间通信--IPC

Linux 进程间通信(IPC)

Linux 进程间通信(IPC)

Linux进程间通信 --- IPC机制(转)