我之前从未在Linux上编写任何IPC C ++。

我的问题是我将拥有多个客户端(编写器)和一台服务器(读卡器)。所有这些都将在同一台机器上。作者将向读者提供数据块(字符串/结构)。然后读者将在FIFO中读取它们并对它们做一些事情。

据我所知,Linux上的IPC类型是管道或套接字/消息队列。

我只是想知道是否有人可以推荐我走下去的路。我倾向于插座,但我没有真正的基础。在踏上这段旅程之前,有什么我应该阅读/理解的吗?

由于

有帮助吗?

解决方案

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

第二是速度。对此没有完全正确的答案,但通常情况如下:共享内存,MQ,FiFO,域套接字,网络套接字。

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

最后,一些IPC机制同时具有POSIX和SYSV变体。通常POSIX是要走的路,除非SYSV类型具有您真正需要或想要的某些功能。

编辑:Count0的回答提醒我,你可能对更抽象和更高层次的东西感兴趣。除ACE之外,您还可以查看 Poco 。当然,如果没有提及在某处提升

其他提示

System V IPC使用起来有点繁琐,但它是一种成熟,强大的技术。消息队列可能会执行您想要的操作并支持原子排队/排队。

套接字易于使用,并且还支持通过网络进行通信。但是,它们不进行任何排队,因此您必须在服务器中编写队列管理代码。使用带有C ++的套接字与使用C ++的套接字并没有太大的不同。网上有很多指南,以及史蒂文斯的“Unix网络编程(第1卷)”等书籍,它们深入讨论了这个主题。

这个套接字教程是一个让你的脚湿透的好地方。

然后,您需要了解线程&互斥体此处

上面你已经开始玩了; - )

虽然你没有要求书籍,并且因为上面的答案非常好,但我只是建议你拿到这两本书的副本:

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

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

有不可避免的问题&通过这种编码,这两本书将帮助您解决遇到的任何困惑。

尝试查看 ACE (自适应通信环境) 。 ACE库是免费的,非常成熟和跨平台。不幸的是,好的文档不是,我建议这本书来寻找好的解决方案您可以尝试查看本教程以获取感觉模式(在文档的最后)。 ACE使用一堆模式非常成功地处理这些问题,特别是在网络环境中,所以它应该是一个良好的开端,可以使用好的模式和方法。

特别是 Ace_Task ,使用 Message_Queue 可以让您做到所需。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top