进程间通信建议

时间:2009-12-15 09:13:02

标签: c++ linux ipc

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

目前,我在想Named Pipe,因为它是由操作系统本身提供的。是否有关于性能或可用性的警告?

共享记忆会更好吗?

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

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


更新: 我想构建一个小程序(守护进程),告诉其他程序(它自己启动)暂停,报告状态,停止等等。

因此,应通知其他程序新命令正在等待它。管道不是理想的,是吗?

6 个答案:

答案 0 :(得分:11)

如您所见,您可以用于进程间通信:

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

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

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

最好的方法是使用可以在两个进程位于同一台计算机上使用共享内存的类来抽象您的通信,如果不是,则使用套接字。然后你必须在UDP和TCP之间进行选择; - )

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

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

my2cents

编辑:

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

答案 1 :(得分:6)

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

我只玩过它,所以可能有更好的选择。

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

答案 2 :(得分:4)

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

答案 3 :(得分:2)

D-Bus在同一主机中执行ipc非常有用且非常稳定。 http://www.freedesktop.org/wiki/Software/dbus

答案 4 :(得分:1)

我会使用unix套接字或一些包装它们的库。 Unix套接字很容易使用。

另一方面,如果你有固定大小的状态信息要报告,你可以让子进程将它写入一个文件(可能它很小,你不会fsync它,所以它不会产生重大的IO工作负载)。

答案 5 :(得分:1)

如果您希望直接从基元构建软件,共享内存和信号量是最快且最透明的。

命名管道与管道没有太大差别,并且在一对进程之间工作良好,而不是服务器和许多客户端。

如果您希望以现有基础架构为基础,可以选择dBus。

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