【问题标题】:Cross platform IPC [closed]跨平台 IPC [关闭]
【发布时间】:2010-09-08 19:21:58
【问题描述】:

我正在寻找有关可能的 IPC 机制的建议:

  • 跨平台(至少 Win32 和 Linux)
  • 易于在 C++ 以及最常见的脚本语言(perl、ruby、python 等)中实现。
  • 最后,从编程的角度来看,使用简单

我的选择是什么?我在 Linux 下编程,但我希望我写的东西将来可以移植到其他操作系统。我考虑过使用套接字、命名管道或 DBus 之类的东西。

【问题讨论】:

    标签: cross-platform ipc


    【解决方案1】:

    就速度而言,最好的跨平台 IPC 机制将是管道。但是,这假设您希望在同一台机器上跨平台 IPC。如果您希望能够与远程机器上的进程通信,您需要考虑使用套接字。幸运的是,如果您至少在谈论 TCP,套接字和管道的行为几乎相同。虽然用于设置和连接它们的 API 不同,但它们都只是像数据流一样。

    然而,困难的部分不是沟通渠道,而是您传递的信息。你真的很想看看可以为你执行验证和解析的东西。我建议查看 Google 的 Protocol Buffers。您基本上创建了一个描述要在进程之间传递的对象的规范文件,并且有一个编译器可以生成多种不同语言的代码,用于读取和写入与规范匹配的对象。这比尝试自己提出消息传递协议和解析器要容易得多(并且不易出错)。

    【讨论】:

    • 当您想与已经启动并运行的进程进行通信时,管道是否是答案?为此,应该是套接字吧?
    • @donatello,我想是named pipes
    • 想补充一点,现在(10 年后!)gRPC 也已开源,是 Google 的基于 Protocol Buffers 的 RPC 协议。
    【解决方案2】:

    对于 C++,请查看 Boost IPC
    您也可以为脚本语言创建或查找一些绑定。

    否则,如果能够与脚本语言交互真的很重要,那么最好的选择就是使用文件、管道或套接字,甚至是 HTTP 等更高级别的抽象。

    【讨论】:

      【解决方案3】:

      为什么不用 D-Bus?这是一个非常简单的消息传递系统,几乎可以在所有平台上运行,并且专为健壮性而设计。目前几乎所有脚本语言都支持它。

      http://freedesktop.org/wiki/Software/dbus

      【讨论】:

      • “D-Bus 是根据您选择的 Academic Free License 版本 2.1 或 GNU General Public License 版本 2 授权给您的。” - GPL 可能不适合。
      • @Nick D-Bus 许可证只会在他尝试修改 D-Bus 时影响他。只要他只是将它用于通信,D-Bus 是否是 GPL 并不重要
      • D-BUS 有一些缺点(除了许可证):1)它不是很快 2)你需要一个守护进程运行 d-bus 才能工作(afaik)
      • 我真的不会将 d-bus 描述为“非常简单”。恕我直言,这很复杂。
      • @kralyk 您不需要运行 dbus 守护程序,您只需要一个服务器端和一个客户端,以便一侧可以连接到另一侧。 dbus 在概念上非常简单,但直接使用 libdbus 可能相当复杂,是的,这就是为什么您很可能希望使用高级绑定。
      【解决方案4】:

      如果你想要一个可移植、易于使用、多语言和LGPLed 的解决方案,我会推荐你​​ZeroMQ

      • 速度惊人,几乎可以线性缩放,而且仍然很简单。
      • 适用于简单和复杂的系统/架构。
      • 提供非常强大的通信模式:REP-REP、PUSH-PULL、PUB-SUB、PAIR-PAIR。
      • 如果您在线程 (inproc://)、进程 (ipc://) 或机器 ( {tcp|pgm|epgm}://),在 VMware 虚拟机 (vmci://) 之间运行连接的情况下,可以通过智能选项减少部分协议开销。。李>

      对于序列化,我会建议 MessagePack 或 Protocol Buffers(其他人也已经提到过),这取决于您的需要。

      【讨论】:

        【解决方案5】:

        您可能想尝试YAMI,它非常简单但功能强大,可移植,并且可以绑定到几种语言

        【讨论】:

          【解决方案6】:

          Facebook's Thrift怎么样?

          Thrift 是一个用于可扩展的跨语言服务开发的软件框架。它将软件堆栈与代码生成引擎相结合,以构建在 C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、Smalltalk 和 OCaml 之间高效无缝工作的服务。

          【讨论】:

          • 听起来开销很大。
          【解决方案7】:

          我想你会想要一些基于套接字的东西。

          如果您想要 RPC 而不仅仅是 IPC,我建议您使用 XML-RPC/SOAP 之类的东西,它通过 HTTP 运行,并且可以从任何语言中使用。

          【讨论】:

          • 是的,我想我的意思是 RPC 是机器间(运行不同操作系统的两台机器之间的跨平台),而 IPC 是一台机器上两个进程之间的意思(源级别的跨平台构建在例如 Linux 和 Windows 上)。
          【解决方案8】:

          YAMI - Yet Another Messaging Infrastructure 是一个轻量级的消息传递和网络框架。

          【讨论】:

            【解决方案9】:

            我可以建议您使用plibsys C 库。它非常简单、轻量级和跨平台。根据 LGPL 发布。它提供:

            • 命名的系统范围共享内存区域(System V、POSIX 和 Windows 实现);
            • 为访问同步命名的系统范围信号量(System V、POSIX 和 Windows 实现);
            • 基于共享内存和信号量的命名系统范围共享缓冲区实现;
            • 支持 IPv4 和 IPv6 的套接字(TCP、UDP、SCTP)(UNIX 和 Windows 实现)。

            这是一个易于使用的库,具有相当好的文档。由于它是用 C 编写的,因此您可以轻松地从脚本语言进行绑定。

            如果您需要在进程之间传递大型数据集(尤其是在速度很重要的情况下),最好使用共享内存来传递数据本身,并使用套接字来通知进程数据已准备好。您可以按以下方式进行:

            • 进程将数据放入共享内存段,并通过套接字向另一个进程发送通知;由于通知通常非常小,因此时间开销很小;
            • 另一个进程收到通知,从共享内存段中读取数据;之后,它会向第一个进程发送数据已读回的通知,以便它可以提供更多数据。

            这种方法可以跨平台的方式实现。

            【讨论】:

              【解决方案10】:

              如果您愿意尝试一些不同的东西,可以使用ZeroCICE 平台。它是开源的,几乎所有你能想到的操作系统都支持它,并且支持 C++、C#、Java、Ruby、Python 和 PHP。最后,它非常易于驱动(语言映射经过定制以自然地适应每种语言)。它也快速高效。甚至还有针对设备的精简版。

              【讨论】:

                【解决方案11】:

                分布式计算通常很复杂,建议您使用现有的库或框架,而不是重新发明轮子。之前的海报已经列举了几个这样的库和框架。根据您的需要,您可以选择非常低级别(如套接字)或高级框架(如 CORBA)。不能有一个通用的“使用这个”答案。您需要对分布式编程进行自学,然后会发现为工作选择正确的库或框架要容易得多。

                存在一个广泛使用的用于分布式计算的 C++ 框架,称为 ACE 和 CORBA ORB TAO(基于 ACE)。有很多关于 ACE http://www.cs.wustl.edu/~schmidt/ACE/ 的好书,所以你可以看看。保重!

                【讨论】:

                  【解决方案12】:

                  没有比使用管道更简单的了,我知道的每个操作系统都支持管道,并且几乎可以用每种语言访问。

                  查看this 教程。

                  【讨论】:

                  • 教程链接失效了,你有其他链接,或者我们可以使用一些关键字来追踪它吗?
                  • 据我所知,在 Win32 和 unix 中没有类似的管道 api,除非您使用 cygwin,这对于大多数 Windows 程序来说不是一个非常方便的选择。
                  • Here是回程机的教程链接。
                  【解决方案13】:

                  到本地主机 FTW 的 TCP 套接字。

                  【讨论】:

                    【解决方案14】:

                    Python 有一个相当不错的 IPC 库:见 https://docs.python.org/2/library/ipc.html

                    【讨论】:

                      【解决方案15】:

                      Xojo 通过其IPCSocket class 内置了跨平台 IPC 支持。尽管您显然无法用其他语言“实现”它,但您可以在 Xojo 控制台应用程序中使用它并从其他语言调用它,这对您来说可能非常简单。

                      【讨论】:

                        【解决方案16】:

                        在当前时代,有一个非常简单、符合 C++1x、文档完善、兼容 Linux 和 Windows 的开源“CommonAPI”库:CommonAPI C++

                        如果愿意,底层 IPC 系统是 D-Bus (libdbus) 或 SomeIP。应用程序接口是使用为该 Franca IDL 语言量身定制的简单语言指定的。

                        【讨论】:

                          猜你喜欢
                          • 2010-09-20
                          • 2012-12-11
                          • 1970-01-01
                          • 2011-01-13
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2011-09-04
                          • 1970-01-01
                          相关资源
                          最近更新 更多