独立程序的多对一双向通信

Posted

技术标签:

【中文标题】独立程序的多对一双向通信【英文标题】:Many-to-one two-way communication of separate programs 【发布时间】:2019-06-12 17:51:03 【问题描述】:

我正在尝试在 Linux 中的程序之间进行双向多对一通信。

我的计划如下:一个名为“驱动程序”的与硬件通信的程序需要与 Linux 中未知数量的应用程序通信。 我读到,进程间通信最常见的方式之一是“命名管道”。

我还没有找到的问题是:新程序应该如何通知驱动程序一个新程序正在运行,以便在新程序和驱动程序之间建立另一个连接(命名管道)?

所有程序都将用 C++ 编写

【问题讨论】:

我认为在这种情况下套接字比管道更有意义。驱动进程可以监听环回设备,其他进程在需要与驱动通信时只需发起 TCP 连接即可。 我正在使用运行 raspbian lite 的树莓派 2B。我可能错了,但我认为 TCP 套接字为此目的会有点开销。 @MrBit A AF_UNIX/AF_LOCAL 套接字只不过是一个命名管道 afaik,它拥有你想要的所有不错的功能,就像 select 支持创建一个真正基于事件的驱动程序。如果您稍后决定让其他机器能够连接(可能是来自另一个 Pi 的驱动程序),您的框架将为它做好准备。 是的,使用 UNIX 套接字! 让我们continue this discussion in chat. 【参考方案1】:

本质上,您所描述的是程序之间的服务器/客户端关系;每个程序在通信桥的两侧做什么可能是无关紧要的。

即使从问题中显示这些进程打算在同一台计算机上,您仍然可以通过 localhost 访问网络。

如果您不喜欢管道,为什么不使用每个程序(客户端)都知道的驱动程序(服务器)端口,服务器侦听该端口?

我相信这就是 X-Windows 的基本理念。

另外,应该有很多可靠的代码可以帮助您入门。

【讨论】:

【参考方案2】:

我也认为套接字可能是一个更好的解决方案,但如果你真的想要命名管道,我会这样做:

服务器打开一个名为channel_request 的管道进行读取。任何新客户端打开它进行写入并写入一个唯一 ID。 (PID应该工作)。服务器读取这个 id 并创建一个名为channel_[id] 的命名管道。然后客户端打开channel_[id] 进行读取并可以开始接收数据。

请注意,Linux 管道是单向的,因此如果您想要如图所示的双向通信,则需要同时打开 channel_[id]_outchannel_[id]_in

【讨论】:

以上是关于独立程序的多对一双向通信的主要内容,如果未能解决你的问题,请参考以下文章

hibernate学习四 hibernate关联关系映射

Hibernate框架学习之注解配置关系映射

spring boot jpa中的多对一映射中的外键未在子表中更新

Hibernate 双向 多对一

idea中注解配置一对多,多对一,双向多对一映射(不详细)

hibernate中配置单向多对一关联,和双向一对多