跨平台IPC

我正在寻找可能的IPC机制的build议是:

  • 跨平台 (Win32和Linux至less)
  • 使用C ++以及最常用的脚本语言 (perl,ruby,python等)很容易实现。
  • 最后,从编程的angular度来看简单易用

我的select是什么? 我在Linux下进行编程,但是我希望将来可以写入其他操作系统。 我想过使用套接字,命名pipe道或类似于DBus的东西。

在速度方面,最好的跨平台的IPC机制将是pipe道。 然而,假定你想在同一台机器上使用跨平台的IPC。 如果你想能够和远程机器上的进程交谈,你需要使用socket来代替。 幸运的是,如果你至less在谈论TCP,套接字和pipe道的行为几乎是一样的。 虽然用于设置和连接它们的API是不同的,但它们只是performance为数据stream。

然而,困难的部分不是沟通渠道,而是你传递的信息。 你真的想看看会为你执行validation和parsing的东西。 我build议看看Google的Protocol Buffers 。 您基本上创build了一个描述您想要在进程之间传递的对象的spec文件,并且有一个编译器以多种不同的语言生成代码,以读取和编写符合规范的对象。 这比自己想出一个消息传递协议和parsing器要容易得多(而且更容易出错)。

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

否则,如果能够与脚本语言接口真的很重要,最好的办法就是使用文件,pipe道或套接字,甚至像HTTP一样的更高层次的抽象。

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

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

你可能想尝试YAMI ,它非常简单但function强大,可移植,并绑定到less数语言

Facebook的节俭怎么样?

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

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

如果你想要RPC而不是IPC,我会build议像XML-RPC / SOAP这样的运行在HTTP上的东西,并且可以使用任何语言。

TCP套接字到localhost FTW。

如果你愿意尝试一些不同的东西,那就是ZeroC的ICE平台。 它是开放源代码的,几乎每一个你能想到的操作系统都支持它,并为C ++,C#,Java,Ruby,Python和PHP提供语言支持。 最后,开车非常容易(语言映射是根据每种语言自然匹配的)。 这也是快速和高效的。 甚至有设备的缩减版本。

如果你想要一个便携,易于使用,多语言和LGPL解决scheme,我会build议你ZeroMQ :

  • 令人惊讶的快速,几乎线性可缩放,仍然简单。
  • 适用于简单和复杂的系统/体系结构。
  • 非常强大的通信模式可用:REP-REP,PUSH-PULL,PUB-SUB,PAIR-PAIR。
  • 如果您在线程( inproc:// ),进程( ipc:// )或计算机( {tcp|pgm|epgm}:// )之间传递消息,则可以configuration传输协议选项,以在VMware虚拟机( vmci:// )之间运行连接的情况下vmci://部分协议开销。

对于序列化,我会build议MessagePack或协议缓冲区(其他已经提到,以及),根据您的需要。

分布式计算通常很复杂,build议您使用现有的库或框架,而不是重新发明轮子。 以前的海报已经列举了一些这样的库和框架。 根据您的需要,您可以select非常低的级别(如套接字)或高级别的框架(如CORBA)。 不能有一个通用的“使用这个”的答案。 你需要了解分布式编程,然后发现为工作select合适的库或框架要容易得多。

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

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

它不会比使用pipe道更简单,pipe道支持每个我知道的操作系统,并且几乎可以用任何语言访问。

看看这个教程。

我可以build议你使用plibsys C库。 这是非常简单,轻量级和跨平台的。 根据LGPL发布。 它提供:

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

使用相当好的文档库是很容易的。 由于它是用C语言编写的,你可以很容易地从脚本语言中进行绑定。

如果您需要在进程之间传递大量数据(尤其是速度至关重要),最好使用共享内存来传递数据本身和套接字,以通知进程数据已准备就绪。 你可以做如下:

  • 一个进程将数据放入共享内存段,并通过套接字发送通知给另一个进程; 因为通知通常是非常小的时间开销是最小的;
  • 另一个进程接收通知并从共享内存段读取数据; 之后,它会发送一个通知,说明数据已被读回第一个进程,以便能够提供更多的数据。

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

你可能想看看openbinder 。

Python有一个非常好的IPC库:请参阅https://docs.python.org/2/library/ipc.html

谷歌protobufs是一个非常糟糕的想法,你想容易维护和debugging代码。 它太容易被人滥用,并用它来污染你的代码。 proto文件很好,但是它与结构头文件基本上是一样的,它生成的代码是完整的废话,使你不知道它是否真的是一个秘密的攻击工具破坏软件项目,而不是自动化它们。 在使用它一段时间之后,几乎不可能将它从代码中删除。 你最好使用一个容易debugging的修正格式结构的头文件。

如果您确实需要压缩,请远程切换到文件结构的地址/数据映射…然后数据包只是一组地址/数据对…也是一个非常容易使用您自己的perl脚本自动生成的结构代码是人类可读和可debugging的