我之前从未在Linux上编写任何IPC C ++。
我的问题是我将拥有多个客户端(编写器)和一台服务器(读卡器)。所有这些都将在同一台机器上。作者将向读者提供数据块(字符串/结构)。然后读者将在FIFO中读取它们并对它们做一些事情。
据我所知,Linux上的IPC类型是管道或套接字/消息队列。
我只是想知道是否有人可以推荐我走下去的路。我倾向于插座,但我没有真正的基础。在踏上这段旅程之前,有什么我应该阅读/理解的吗?
由于
答案 0 :(得分:5)
您应该考虑的主要问题是您传递的数据类型,因为这将部分决定您的选择。这取决于您的数据是否有限。如果它没有限制,那么像FIFO或套接字这样的流是合适的;如果是,那么你可以更好地利用MQ或共享内存等东西。既然你提到了字符串和结构,很难说在你的情况下什么是合适的,但是如果你的字符串在某个合理的最大范围内有限,你可以使用任何带有一些小问题的东西。
第二是速度。对此没有完全正确的答案,但通常情况如下:共享内存,MQ,FiFO,域套接字,网络套接字。
第三是易用性。共享内存是最大的PITA,因为您必须处理自己的同步。只要您的消息长度保持低于PIPE_BUF大小,管道就很容易。操作系统使用MQ处理大部分麻烦。插座很容易,但你有设置样板。
最后,一些IPC机制同时具有POSIX和SYSV变体。通常POSIX是要走的路,除非SYSV类型具有您真正需要或想要的某些功能。
编辑:Count0的回答提醒我,你可能对更抽象和更高层次的东西感兴趣。除ACE之外,您还可以查看Poco。当然,如果没有在某处提及Boost,那么没有完整答案是完整的。答案 1 :(得分:3)
System V IPC使用起来有点繁琐,但它是一种成熟,强大的技术。消息队列可能会执行您想要的操作并支持原子排队/排队。
套接字易于使用,并且还支持通过网络进行通信。但是,它们不进行任何排队,因此您必须在服务器中编写队列管理代码。使用带有C ++的套接字与使用C ++的套接字并没有太大的不同。网上有很多指南,以及史蒂文斯的“Unix网络编程(第1卷)”等书籍,它们深入讨论了这个主题。
答案 2 :(得分:2)
答案 3 :(得分:2)
虽然你没有要求书籍,并且因为上面的答案非常好,但我只是建议你拿到这两本书的副本:
UNIX网络编程,第2卷,第2版:进程间通信,W。Richard Stevens
UNIX环境中的高级编程,第二版,W。Richard Stevens和Stephen A. Rago
有不可避免的问题&通过这种编码,这两本书将帮助您解决遇到的任何困惑。
答案 4 :(得分:1)
尝试查看ACE(自适应通信环境)。 ACE库是免费的,非常成熟和跨平台。不幸的是,好的文档不是,我建议this book寻找一个好的解决方案。您可以尝试查看this tutorial以了解模式(在文档末尾)。 ACE使用一堆模式非常成功地处理这些问题,特别是在网络环境中,所以它应该是一个良好的开端,可以使用好的模式和方法。
特别是 Ace_Task ,使用 Message_Queue 可以让您做到所需。