74

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

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

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

4

16 回答 16

56

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

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

于 2008-09-15T19:22:37.350 回答
16

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

否则,如果能够与脚本语言交互真的很重要,那么最好的选择就是使用文件、管道或套接字,甚至是 HTTP 等更高级别的抽象。

于 2008-09-13T16:19:10.520 回答
10

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

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

于 2008-09-16T17:04:46.143 回答
10

如果您想要一个可移植、易于使用、多语言和LGPL ed 的解决方案,我会推荐您ZeroMQ

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

对于序列化,我会建议MessagePack或 Protocol Buffers(其他人也已经提到过),具体取决于您的需要。

于 2014-07-30T10:22:40.920 回答
8

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

于 2008-09-15T22:11:03.607 回答
5

Facebook 的 Thrift怎么样?

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

于 2008-09-13T16:21:24.227 回答
5

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

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

于 2008-09-13T17:17:20.753 回答
5

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

于 2010-01-25T23:52:16.567 回答
5

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

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

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

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

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

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

于 2016-06-19T18:54:44.037 回答
4

如果你愿意尝试一些不同的东西,那就是ZeroC的ICE平台。它是开源的,几乎所有你能想到的操作系统都支持它,并且支持 C++、C#、Java、Ruby、Python 和 PHP。最后,它非常容易驱动(语言映射经过定制,可以自然地适应每种语言)。它也快速高效。甚至还有设备的精简版。

于 2008-09-15T19:39:28.073 回答
4

分布式计算通常很复杂,建议您使用现有的库或框架,而不是重新发明轮子。之前的海报已经列举了几个这样的库和框架。根据您的需要,您可以选择非常低级别(如套接字)或高级框架(如 CORBA)。不能有一个通用的“使用这个”答案。您需要对分布式编程进行自我教育,然后会发现为工作选择正确的库或框架要容易得多。

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

于 2008-12-08T22:55:24.297 回答
3

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

看看这个教程。

于 2008-09-13T16:27:20.173 回答
2

到本地主机 FTW 的 TCP 套接字。

于 2008-09-13T17:03:28.527 回答
0

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

于 2008-09-16T17:07:42.610 回答
0

Xojo 通过其IPCSocket 类内置了跨平台 IPC 支持。尽管您显然无法用其他语言“实现”它,但您可以在 Xojo 控制台应用程序中使用它并从其他语言调用它,这对您来说可能非常简单。

于 2018-09-24T20:22:13.360 回答
0

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

底层 IPC 系统是 D-Bus (libdbus) 或 SomeIP(如果需要)。应用程序接口是使用为该 Franca IDL 语言量身定制的简单语言指定的。

于 2020-03-05T10:39:08.060 回答