跨平台IPC

Tho*_*omi 72 cross-platform ipc

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

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

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

Dou*_*yle 55

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

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

  • 想补充一点的是,现在(10 年后!)gRPC 也已经开源,它是基于 Protocol Buffers 的 Google 的 RPC 协议。 (3认同)

Bri*_*ndy 16

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

否则,如果能够与脚本语言接口非常重要,那么最好的办法就是使用文件,管道或套接字,甚至是HTTP等更高级别的抽象.


ape*_*arr 10

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

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

  • 我真的不会将d-bus描述为"非常简单".Imho它很复杂. (8认同)
  • @kralyk不需要运行dbus守护程序,只需要服务器端和客户端即可,以便一侧可以连接到另一侧。dbus在概念上非常简单,但是直接使用libdbus可能会相当复杂,是的,这就是为什么您最有可能想要使用高级绑定的原因。 (2认同)

Peq*_*que 9

如果你想要一个便携,易用,多语言和LGPL ed解决方案,我建议你ZeroMQ:

  • 惊人的快速,几乎线性可扩展,仍然很简单.
  • 适用于简单和复杂的系统/架构.
  • 非常强大的通信模式:REP-REP,PUSH-PULL,PUB-SUB,PAIR-PAIR.
  • 您可以配置传输协议,以便在线程(inproc://),进程(ipc://)或机器({tcp|pgm|epgm}://)之间传递消息时使其更有效,并使用智能选项在VMware之间运行连接时削减部分协议开销虚拟机(vmci://).

对于序列化,我建议使用MessagePack或Protocol Buffers(其他人已经提到过),具体取决于您的需求.


小智 8

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


Swa*_*C H 5

如何Facebook的节俭

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

  • 听起来像很多开销. (2认同)

Dou*_*der 5

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

如果您想要RPC而不仅仅是IPC,我建议像XML-RPC/SOAP一样运行在HTTP上,并且可以使用任何语言.


mlo*_*kot 5

YAMI - 另一种消息传递基础设施是一种轻量级的消息传递和网络框架.


Ale*_*kin 5

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

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

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

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

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

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