跨平台IPC

跨平台IPC

Cross platform IPC

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

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

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


在速度方面,最好的跨平台IPC机制是管道。但是,这假定您要在同一台计算机上使用跨平台IPC。如果您希望能够与远程计算机上的进程进行通讯,则可以考虑使用套接字。幸运的是,至少在谈论TCP时,套接字和管道的行为几乎相同。尽管用于设置它们和连接它们的API不同,但是它们都像数据流一样工作。

但是,困难的部分不是通信通道,而是您通过它传递的消息。您确实希望查看可以为您执行验证和解析的内容。我建议查看Google的协议缓冲区。基本上,您将创建一个描述文件,该文件描述了要在流程之间传递的对象,并且有一个编译器以多种不同的语言生成代码,用于读取和编写与该规范匹配的对象。这比尝试自己制定一个消息传递协议和解析器要容易得多(并且不易出错)。


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

否则,如果能够与脚本语言进行交互非常重要,那么最好的选择就是简单地使用文件,管道或套接字,甚至使用更高级别的抽象(例如HTTP)。


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

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


您可能要尝试使用YAMI,它非常简单但功能强大,可移植,并且绑定了几种语言


如果您想要一个便携式,易于使用,多语言和LGPLed解决方案,我建议您使用ZeroMQ:

  • 速度惊人,几乎可以线性缩放,而且仍然很简单。
  • 适用于简单和复杂的系统/体系结构。
  • 提供非常强大的通信模式:REP-REP,PUSH-PULL,PUB-SUB,PAIR-PAIR。
  • 如果要在线程(inproc://),进程(ipc://)或机器({tcp|pgm|epgm}://)之间传递消息,可以配置传输协议以使其更有效,并具有精巧的选择来删除协议的某些部分VMware虚拟机(vmci://)之间正在运行连接时的开销。

对于序列化,我会根据您的需求建议使用MessagePack或协议缓冲区(其他也已经提到)。


YAMI-另一个消息传递基础结构是一个轻量级的消息传递和网络框架。


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

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

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

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

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

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


我想您需要基于套接字的东西。

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


Facebook的Thrift怎么样?

Thrift is a software framework for scalable cross-language services development. It combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk, and OCaml.


分布式计算通常很复杂,因此建议您使用现有的库或框架,而不要浪费时间。先前的张贴者已经列举了其中的一些库和框架。根据您的需求,您可以选择非常低级的框架(例如套接字)或高级框架(例如CORBA)。不能有一个通用的"使用此"答案。您需要对分布式编程进行自我教育,然后发现为工作选择合适的库或框架要容易得多。

有一种广泛使用的用于分布式计算的C ++框架,称为ACE和CORBA ORB TAO(基于ACE)。有关于ACE的非常好的书籍http://www.cs.wustl.edu/~schmidt/ACE/,所以您可以看看。照顾自己!


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


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

查看本教程。


本地FTW的TCP套接字。


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


Xojo的IPCSocket类具有内置的跨平台IPC支持。尽管您显然不能用其他语言"实现"它,但是您可以在Xojo控制台应用程序中使用它,并从其他语言调用它,这对于您来说可能很简单。


google protobufs是一个非常糟糕的主意,因为您希望易于维护和调试代码。人们太容易滥用它并使用它来污染您的代码了。 Proto文件很不错,但是它与结构头文件基本相同,并且它生成的代码是完全废话,使您想知道它是否真的是破坏软件项目而不是使它们自动化的隐蔽攻击工具。使用一段时间后,几乎不可能将其从代码中删除。您最好只使用易于调试的修订格式结构的头文件。

如果您确实需要压缩,请远程切换到归档结构的地址/数据映射...
那么数据包只是一堆地址/数据对……也是一种非常容易与您自己的perl脚本自动化的结构,该脚本可生成易于理解和调试的代码


推荐阅读