跨平台IPC

时间:2008-09-13 16:10:34

标签: cross-platform ipc

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

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

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

17 个答案:

答案 0 :(得分:52)

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

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

答案 1 :(得分:16)

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

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

答案 2 :(得分:9)

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

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

答案 3 :(得分:8)

如果您需要便携,易用,多语言和LGPL解决方案,我建议您ZeroMQ

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

对于序列化,我建议MessagePack或协议缓冲区(其他人已经提到过),具体取决于您的需求。

答案 4 :(得分:8)

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

答案 5 :(得分:5)

Facebook's Thrift怎么样?

  

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

答案 6 :(得分:5)

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

答案 7 :(得分:5)

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

如果您想要RPC而不仅仅是IPC,我建议使用基于HTTP的XML-RPC / SOAP,并且可以使用任何语言。

答案 8 :(得分:4)

如果你愿意尝试一些不同的东西,那就是来自ICEZeroC平台。它是开源的,几乎可以为您所能想到的每个操作系统提供支持,并且支持C ++,C#,Java,Ruby,Python和PHP。最后,它非常容易驾驶(语言映射是为了适应每种语言而自行调整的)。它也快速有效。甚至还有一个用于设备的简化版本。

答案 9 :(得分:4)

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

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

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

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

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

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

答案 10 :(得分:3)

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

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

答案 11 :(得分:3)

它比使用管道更简单,管道在我所知道的每个操作系统上都受支持,并且可以在几乎所有语言中访问。

查看this教程。

答案 12 :(得分:2)

到localhost FTW的TCP套接字。

答案 13 :(得分:0)

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

答案 14 :(得分:0)

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

答案 15 :(得分:0)

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

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

答案 16 :(得分:-5)

谷歌protobufs是一个非常糟糕的主意,你想要易于维护和调试代码。它太容易让人滥用它并用它来污染你的代码。原型文件很好,但它与结构头文件基本相同,它生成的代码是完整的废话让你想知道它是否真的是一个隐蔽的攻击工具来破坏软件项目而不是自动化它们。使用它一段时间后几乎不可能从代码中删除它。你最好只使用一个易于调试的修复格式结构的头文件。

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