Linux IPC – 多个作家,单个阅读器

我从来没有在Linux上写过任何IPC C ++。

我的问题是,我将有多个客户端(作家),和一个单一的服务器(读者)。 所有这些将在同一台机器上。 编写者将把大块的数据(一个string/结构)传送给读者。 然后读者将在FIFO中读取它们,并与他们做一些事情。

据我所知,Linux上的IPCtypes是Pipes或Sockets / Message Queue。

我只是想知道如果有人能推荐我走下去的路。 我倾向于sockets,但是我没有真正的基础。 在开始这个旅程之前,我有什么要读懂的吗?

谢谢

Solutions Collecting From Web of "Linux IPC – 多个作家,单个阅读器"

你应该考虑的主要问题是你传递什么样的数据,因为这将部分决定你的选择。 这取决于您的数据是否有界。 如果没有界限,那么像FIFO或插座这样的流是适当的; 如果是这样,那么你可以更好地利用诸如MQ或共享内存之类的东西。 既然你提到了字符串和结构,很难说你的情况是合适的,但是如果你的字符串被限制在一个合理的最大值范围内,你可以使用任何一些小小的操作。

二是速度。 对此,从来没有一个完全正确的答案,但通常情况下它是这样的:共享内存,MQ,FiO,域套接字,网络套接字。

第三个是易用性。 共享内存是最大的PITA,因为你必须处理自己的同步。 只要您的信息长度保持低于PIPE_BUF的大小,管道很容易。 操作系统使用MQ处理大部分头痛问题。 插座很容易,但你有安装样板。

最后几个IPC机制有POSIX和SYSV变种。 除非SYSV类型具有您真正需要或想要的某些功能,否则一般情况下POSIX是一种方法。

编辑:Count0的答案提醒我,你可能会对更抽象和更高层次的东西感兴趣。 除了ACE,你可以看看波科 。 而且,当然,如果没有提到增强的地方,没有答案是完整的。

系统V IPC使用起来有点费劲,但它是一个成熟的,强大的技术。 消息队列可能会做你想要的,并支持原子排队/排队。

套接字易于使用,也支持通过网络进行通信。 但是,他们不会进行任何排队,所以您将不得不在服务器中编写队列管理代码。 在C ++中使用套接字与在C中使用套接字并没有太大的区别。在网络和书籍上有很多指导,比如Stevens的“Unix Network Programming(vol 1)”,它们在一定程度上涵盖了这个主题。

这个插座教程是一个很好的地方。

然后你需要在线程和互斥体上进行调试 。

有了上面的你们都开始玩了;-)

虽然你还没有要求书籍,而且上面的答案如此之好,我只能建议你把这两个问题的副本放在手上:

UNIX网络编程,第2卷,第二版:进程间通信,W. Richard Stevens

UNIX环境下的高级编程,第二版,W. Richard Stevens和Stephen A. Rago

这种编码是不可避免的,这两本书会帮助你解决你遇到的任何困惑。

尝试看一下ACE (自适应通信环境)。 ACE库是免费的,非常成熟和跨平台。 不幸的是,好的文档不是,我会推荐这本书寻找一个好的解决方案。 您可以尝试看看本教程,以了解模式(在文档的末尾)。 ACE使用了一堆模式来处理这些问题,特别是在网络环境中,非常成功和有效地处理这些问题,所以对于使用好的模式和方法,应该是一个很好的开始。

特别是使用Message_Queue的 Ace_Task允许你做你所需要的。