【问题标题】:Inter-Process Communication Recommendation [closed]进程间通信建议 [关闭]
【发布时间】:2010-12-26 17:50:54
【问题描述】:

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

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

共享内存会更好吗?

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

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


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

所以应该通知其他程序有一个新命令正在等待它。管道并不理想,是吗?

【问题讨论】:

    标签: c++ linux ipc


    【解决方案1】:

    Boost 有一个不错的 InterProcess 库,它是跨平台且非常直观的。

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

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

    【讨论】:

    • 这看起来很有趣。我会看看它。我似乎总是忘记查看 boost 库。
    【解决方案2】:

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

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

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

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

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

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

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

    my2cents

    编辑:

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

    【讨论】:

    • 我想在不使用 TCP 堆栈开销的情况下获得一些东西,因为需要最佳性能。我们也将使用 TCP 与其他机器进行通信,但在本地使用更快的东西是理想的。
    • @brandstaetter :在这种情况下,共享内存是一种方式。数据越大,性能增益就越好。其他 IPC(和套接字)必须进行缓冲,即使它们已经过优化。使用共享内存,您可以确定没有缓冲区开销。我们使用共享内存进行图像交换。同步可以使用命名管道或(本地)套接字完成,比共享信号量更易于管理(并且更便携)。您甚至可以不依赖于您的数据/交换协议...
    • @Matthieu:谢谢。特别是在处理外部接口时,它总是被证明是一件好事:-)
    【解决方案3】:

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

    【讨论】:

    • 嗯,有点矫枉过正,如果尚未安装/设置,我想很难设置?
    【解决方案4】:

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

    另一方面,如果您有固定大小的状态信息要报告回来,您可以让子进程将其写入文件(可能它很小并且您不会对其进行 fsync,因此不会产生显着的IO 工作负载)。

    【讨论】:

    • +1 :是的,为什么不是文件。不是同步的最佳方式,但您可以使用标记/计数器进行同步。
    【解决方案5】:

    一个不错的选择是使用socketpair,非常快速高效。

    【讨论】:

      【解决方案6】:

      如果您想直接从原语构建软件,共享内存和信号量是最快和最透明的。

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

      如果您想在现有基础架构上进行构建,可以选择 dBus。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-01
        • 1970-01-01
        相关资源
        最近更新 更多