进程间通信build议

我正在寻找一种轻量级,快速和简单的方法来处理Linux机器上某些程序之间的进程间通信。

目前,我正在考虑命名pipe道,因为它是由操作系统本身提供的。 有没有关于性能或可用性的警告?

共享内存会更好吗?

我不认为我需要一个超级复杂的框架。

请指出正确的方向,谢谢!


更新:我想build立一个小程序(守护进程),告诉其他程序(它本身开始)暂停,报告他们的状态,停止等。

所以另一个程序应该被通知一个新的命令正在等待它。 一根pipe子不是那么理想,是吗?

Solutions Collecting From Web of "进程间通信build议"

Boost有一个很好的InterProcess库,它是跨平台的,非常直观。

我只是玩弄了它,所以在那里可能会有更好的选择。

但是,如果你不需要共享内存,我会坚持使用消息传递的方法。 你会避免死锁和竞赛条件。 管道的原理真的很棒,它甚至允许懒惰的行为,可以为您节省大量的处理,这取决于手头的事情!

正如你所看到的,你可以使用进程间通信:

  • 共享内存
  • 命名管道
  • TCP / UDP套接字(最终是本地的)

共享内存具有性能优势,因为在发送/接收消息时没有任何缓冲区。 但是你必须同步你的数据交换与另一个IPC。 它可以是IPC信号量或命名管道或套接字。

当性能不是主要目标时,我倾向于使用套接字,因为它们的使用很简单,可以扩展到计算机间通信。

最好的办法是将这两个进程在同一台计算机上的可以使用共享内存的类抽象为一个类,如果不是,则使用套接字。 那么你必须选择UDP和TCP 😉

对于同步/缓冲区交换,更喜欢TCP,因为它更可靠。

我不使用命名管道,因为我更喜欢套接字的可能性使用计算机间通信,当然,你可以找到很多便携式套接字库…

my2cents

编辑:

对于同步来说,共享内存可能不是最好的工具。 在你的情况下,它可以通过共享一个小的内存空间来使用,每个进程等待命令的空间。 您可以轮询任何包含的命令或使用共享的信号量。 最快的方法是您的进程等待命名的信号并为其命令/参数读取一个共享的存储空间。 使用命名管道肯定是更简单但不是那么快。 你当然不需要那么快? 无论如何抽象,在一个类建模你的交易协议,并尝试两种方式:-)

一个很好的选择是使用socketpair ,非常快速和高效。

D-Bus在相同的主机上执行ipc非常有用,非常稳定。 http://www.freedesktop.org/wiki/Software/dbus

我会使用unix套接字,或者一些包装它们的库。 Unix套接字非常易于使用。

另一方面,如果你有固定大小的状态信息来回报,你可以让子进程把它写入一个文件(可能它很小,你不会同步它,所以不会产生大量的IO工作量) 。

共享内存和信号量是最快和最透明的,如果你喜欢从原语构建软件。

命名管道与管道没有太大的不同,在一对进程之间,而不是服务器和许多客户端之间运行良好。

如果你想建立在现有的基础设施,dBus是一个选项。

套接字通信是多功能的,如果您希望在网络上的主机之间移动应用程序,则可以很好地扩展。