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

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

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

有帮助吗?

解决方案

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

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

其他提示

对于 C++,请查看 升压工控机.
您也可以创建或找到一些脚本语言的绑定。

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

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

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

你可能想尝试 亚米 ,它非常简单但实用,可移植,并且可以绑定到几种语言

如果您想要一个便携、易于使用、多语言且 LGPLed解决方案,我会推荐你 零MQ:

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

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

怎么样 Facebook的节俭?

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

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

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

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

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

我可以建议你使用 普利布系统 C 库。它非常简单、轻量级且跨平台。根据 LGPL 发布。它提供:

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

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

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

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

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

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

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

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

查看 教程。

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

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

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

谷歌 protobufs 是一个非常糟糕的主意,因为你想要轻松维护和调试代码。人们很容易滥用它并用它来污染您的代码。原始文件很好,但它基本上与结构头文件相同,并且它生成的代码完全是垃圾,让您怀疑它是否真的是一个秘密攻击工具,用于破坏软件项目而不是自动化它们。使用一段时间后,几乎不可能将其从代码中删除。您最好只使用易于调试的固定格式结构的头文件。

如果您确实需要压缩,请远程切换到文件结构的地址/数据映射......那么数据包只是一堆地址/数据对......也是一种很容易使用您自己的 Perl 脚本实现自动化的结构,生成人类可读和可调试的代码

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top