题
我正在寻找有关可能的 IPC 机制的建议,这些机制是:
- 跨平台 (至少 Win32 和 Linux)
- 易于实施 C++ 以及 最常见的脚本语言 (perl、ruby、python 等)。
- 最后, 使用简单 从编程的角度来说!
我的选择是什么?我在 Linux 下编程,但我希望我编写的内容将来可以移植到其他操作系统。我考虑过使用套接字、命名管道或 DBus 之类的东西。
解决方案
就速度而言,最好的跨平台IPC机制是管道。然而,这假设您希望在同一台机器上跨平台 IPC。如果您希望能够与远程计算机上的进程进行通信,您将需要考虑使用套接字。幸运的是,如果您至少谈论 TCP,套接字和管道的行为几乎相同。虽然用于设置和连接它们的 API 不同,但它们都像数据流一样工作。
然而,困难的部分不是沟通渠道,而是你通过它传递的消息。您确实想看看能够为您执行验证和解析的东西。我建议看看谷歌的 协议缓冲区. 。您基本上创建一个规范文件来描述要在进程之间传递的对象,并且有一个编译器可以生成多种不同语言的代码,用于读取和写入与规范匹配的对象。这比尝试自己提出消息传递协议和解析器要容易得多(并且不易出现错误)。
其他提示
对于 C++,请查看 升压工控机.
您也可以创建或找到一些脚本语言的绑定。
否则,如果能够与脚本语言交互确实很重要,那么最好的选择就是使用文件、管道或套接字,甚至使用更高级别的抽象,例如 HTTP。
为什么不使用 D-Bus?它是一个非常简单的消息传递系统,几乎可以在所有平台上运行,并且专为稳健性而设计。目前几乎所有脚本语言都支持它。
你可能想尝试 亚米 ,它非常简单但实用,可移植,并且可以绑定到几种语言
怎么样 Facebook的节俭?
Thrift 是一个用于可扩展跨语言服务开发的软件框架。它将软件堆栈与代码生成引擎相结合,构建在 C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、Smalltalk 和 OCaml 之间高效、无缝工作的服务。
我想你会想要一些基于套接字的东西。
如果您想要 RPC 而不仅仅是 IPC,我会建议像 XML-RPC/SOAP 这样的东西,它通过 HTTP 运行,并且可以从任何语言使用。
YAMI - 另一个消息基础设施 是一个轻量级消息传递和网络框架。
我可以建议你使用 普利布系统 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 脚本实现自动化的结构,生成人类可读和可调试的代码