首页 > 解决方案 > 如何将数据发送到另一个进程(仅限 c++ 语言级别)

问题描述

假设您正在开发两个应用程序(A 和 B)。

如果您只被允许在 c++ 语言级别(包括标准库和 STL)工作,您如何从 A 向 B 发送一些信息?

现在我在想 std::ofstream 和 std::ifstream 可能是一个可能的解决方案(尽管是一个粗略的解决方案)?- 但是有什么陷阱,可以避免吗?(如何?)。

标签: c++ipcc++17

解决方案


你就是不能。标准 C++17 不了解任何类型的进程间通信,并且对进程知之甚少(除了std::system未真正指定其行为的 thru)。有些操作系统没有任何进程,有些没有文件,有些没有管道。

阅读有关操作系统的更多信息。我强烈推荐操作系统:三个简单的部分(可免费获得)。

当然,您可以读取和写入文件,但是两个进程之间的同步仍然应该发生(也许通过一个接一个地运行,以某种操作系统特定的方式,所以运行 A 然后 B,而这究竟是如何发生的呢?具体的)

阅读 C++17 标准(例如此处的草案)进行检查。

一些 C++17 实现可能甚至没有任何进程的概念。您可以在某些嵌入式系统上拥有完全兼容的 C++17,而无需任何操作系统处理进程。

我的建议是务实的,并使用一些框架,如BoostQtZeroMQPOCO(或旧的Berkeley 套接字)来处理进程和进程间通信设施;你可能会找到一个支持你真正关心的几个操作系统的框架(AFAIK,所有的 Boost、POCO、Qt 都知道 Linux、Windows、MacOSX 并提供一个通用的 API 来抽象它们;但你可以找到一些学术操作系统与它们不兼容;实际上,任何同时针对 Windows 和 POSIX 的框架都应该足够了)。

出于好奇,您可能会发现一个具有良好 C++17 实现的操作系统,它有一个非常奇怪的 API(以GNU Hurd为例)。

如果您的 IPC 工具基于字节流,请查看基于文本的协议(可能是JSONRPC、SOAP、HTTP 等)。它们更容易编码,并且大多数都带有一些与 C++ 兼容的库......

通过几个月的工作和大量的专业知识,您甚至可以将最近的 GCC 或 Clang 移植到大多数其他操作系统:他们小心翼翼地以一种巧妙的方式抽象出对操作系统的要求。

请记住,您可能会找到甚至没有任何文件系统的操作系统:查看CapROSContiki以获取最近的一些示例,并查看tunes.org内部,在过去的一个世纪中,与您的主题相关的有趣讨论已被存档。但是有些痛苦(我猜 GCC 或 Clang 专家需要几个月的工作),您将能够移植最近的GCCClang来定位它,以获得针对它们的 C++17 交叉编译器。

恕我直言,一个 C++ 标准库,它只能“打开”一个“文件”(据说命名为THEFILE)符合 C++17 标准的字母。AFAIK,你没有任何保证std::ifstream成功std::ofstream工作。

顺便说一句,当前的处理器实际上是多核的,因此尝试并行运行 A 和 B 并执行一些 IPC(以特定于操作系统的方式,可能由某些框架或库抽象)是很有意义的。


推荐阅读