我正在寻找一种轻量级、快速且易于处理Linux机器上多个程序间进程通信的方法。
目前,我考虑使用Named Pipe,因为它是由操作系统自己提供的。那么在性能和可用性方面是否存在缺陷?
Shared Memory会更好吗?
我不认为我需要一个超级复杂的框架。
请指引我正确的方向,谢谢!
更新: 我想要构建一个小型程序(守护进程),告诉其他程序(它自己启动的)暂停、报告其状态,停止等。
因此,其他程序应该被通知有新命令正在等待它。对于这个需求,使用管道不是最理想的方法,对吗?
如您所见,您可以使用以下方法进行进程间通信:
共享内存具有性能优势,因为在发送/接收消息时没有缓冲区。但是,您必须与另一个IPC同步数据交换。它可以是IPC信号量或...... 命名管道或套接字。
当性能不是主要目标时,我倾向于选择套接字,因为它们的使用简单,并且可以扩展到计算机之间的通信。
最好的方法是使用类来抽象化您的通信,该类可以在两个进程在同一台计算机上时使用共享内存,并使用套接字否则。然后,您必须选择UDP和TCP之间的选择;-)
对于同步/缓冲器交换,请优先选择TCP,因为它更可靠。
我不使用命名管道,因为我更喜欢套接字,因为它具有使用计算机间通信的可能性,当然您可以找到许多可移植的套接字库......
我的2美分
编辑:
对于同步,共享内存可能不是最好的工具。在您的情况下,可以通过共享小内存空间,并为每个等待命令的进程分配一个空间来使用它。您可以轮询任何即将到来的命令,也可以使用共享信号量。最快的方法是您的进程等待命名信号量并读取共享的mem空间以获得其命令/参数。使用命名管道肯定更简单,但速度不那么快。您当然不需要那么快吧?无论如何,将其抽象化为模拟您的交换协议的类,并尝试这两种方式:-)
D-Bus是一种非常稳定和实用的在同一主机内进行进程间通信的技术。
http://www.freedesktop.org/wiki/Software/dbus我会使用Unix套接字或一些封装它们的库。Unix套接字非常容易使用。
另一方面,如果您需要报告固定大小的状态信息,您可以让子进程将其写入文件中(假设它很小,您不会fsync它,因此它不会产生重要的IO工作负载)。
如果您想从原语开始构建软件,共享内存和信号量是最快且最透明的选择。
命名管道与管道并没有太大区别,适用于一对进程之间的通信,而不是服务器和多个客户端之间的通信。
如果您想在现有基础设施上构建应用程序,dBus 是一个选项。
如果您希望将应用程序移动到网络上的其他主机上,套接字通信是一种多才多艺且可扩展的选择。