跨平台IPC [关闭]


73

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

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

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

Answers:


55

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

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


当您要与已经启动并正在运行的进程进行通信时,管道是答案吗?为此,它应该是插座吗?
donatello

@donatello,我想这叫管道
moooeeeep 2012年

3
现在想补充一下(10年后!)gRPC也已经开源,这是Google的基于协议缓冲区的RPC协议。
托马斯

16

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

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


10

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

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


1
“ D-Bus是根据您选择的2.1版学术免费许可证或2版GNU通用公共许可证获得许可的。” -GPL可能不适合。
尼克,2010年

@Nick D-Bus许可证仅在他尝试修改D-Bus时才会影响他。只要他仅使用它进行通信,D-Bus是否为GPL都不重要
SystematicFrank

1
D-BUS有一些缺点(除许可证外):1)速度不快2)您需要运行一个守护程序来使d-bus工作(afaik)
kralyk,2012年

10
我真的不会将d-bus描述为“非常简单”。恕我直言,这很复杂。
kralyk

2
@kralyk不需要运行dbus守护程序,只需要服务器端和客户端即可,以便一侧可以连接到另一侧。dbus在概念上非常简单,但是直接使用libdbus可能会相当复杂,是的,这就是为什么您最有可能想要使用高级绑定的原因。
雷米2014年

10

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

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

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


8

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


5

如何Facebook的节俭

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


2
听起来很多开销。
d -_- b

5

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

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


是的,我想我的意思是RPC是指机器间(运行不同OS的两台机器之间的跨平台),而IPC则是指一台机器上的两个进程之间的含义(源代码在例如Linux和Windows上是跨平台的)。
道格拉斯·里德


5

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

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

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

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

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

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


4

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


4

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

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


3

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

查看教程。


1
教程链接已损坏,您是否还有其他链接,或者我们可以使用某些关键词来进行跟踪?
rcreswick

1
据我所知,除非您使用cygwin,否则在Win32和UNIX中没有类似的管道api,对于大多数Windows程序来说,cygwin都不是很方便的选择。
Laserallan

2
是通过Wayback机器的教程链接。
拉斯,



0

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


0

在当今时代,有一个非常简单的,符合C ++ 1x的,有据可查的,与Linux和Windows兼容的开源“ CommonAPI”库:CommonAPI C ++

如果需要,底层IPC系统是D-Bus(libdbus)或SomeIP。应用程序接口是使用一种简单的方法并针对该Franca IDL语言量身定制的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.