c++ - 如何将数据发送到另一个进程(仅限 c++ 语言级别)
问题描述
假设您正在开发两个应用程序(A 和 B)。
如果您只被允许在 c++ 语言级别(包括标准库和 STL)工作,您如何从 A 向 B 发送一些信息?
现在我在想 std::ofstream 和 std::ifstream 可能是一个可能的解决方案(尽管是一个粗略的解决方案)?- 但是有什么陷阱,可以避免吗?(如何?)。
解决方案
你就是不能。标准 C++17 不了解任何类型的进程间通信,并且对进程知之甚少(除了std::system
未真正指定其行为的 thru)。有些操作系统没有任何进程,有些没有文件,有些没有管道。
阅读有关操作系统的更多信息。我强烈推荐操作系统:三个简单的部分(可免费获得)。
当然,您可以读取和写入文件,但是两个进程之间的同步仍然应该发生(也许通过一个接一个地运行,以某种操作系统特定的方式,所以运行 A 然后 B,而这究竟是如何发生的呢?具体的)
阅读 C++17 标准(例如此处的草案)进行检查。
一些 C++17 实现可能甚至没有任何进程的概念。您可以在某些嵌入式系统上拥有完全兼容的 C++17,而无需任何操作系统处理进程。
我的建议是务实的,并使用一些框架,如Boost、Qt、ZeroMQ或POCO(或旧的Berkeley 套接字)来处理进程和进程间通信设施;你可能会找到一个支持你真正关心的几个操作系统的框架(AFAIK,所有的 Boost、POCO、Qt 都知道 Linux、Windows、MacOSX 并提供一个通用的 API 来抽象它们;但你可以找到一些学术操作系统与它们不兼容;实际上,任何同时针对 Windows 和 POSIX 的框架都应该足够了)。
出于好奇,您可能会发现一个具有良好 C++17 实现的操作系统,它有一个非常奇怪的 API(以GNU Hurd为例)。
如果您的 IPC 工具基于字节流,请查看基于文本的协议(可能是JSONRPC、SOAP、HTTP 等)。它们更容易编码,并且大多数都带有一些与 C++ 兼容的库......
通过几个月的工作和大量的专业知识,您甚至可以将最近的 GCC 或 Clang 移植到大多数其他操作系统:他们小心翼翼地以一种巧妙的方式抽象出对操作系统的要求。
请记住,您可能会找到甚至没有任何文件系统的操作系统:查看CapROS或Contiki以获取最近的一些示例,并查看tunes.org内部,在过去的一个世纪中,与您的主题相关的有趣讨论已被存档。但是有些痛苦(我猜 GCC 或 Clang 专家需要几个月的工作),您将能够移植最近的GCC或Clang来定位它,以获得针对它们的 C++17 交叉编译器。
恕我直言,一个 C++ 标准库,它只能“打开”一个“文件”(据说命名为THEFILE
)符合 C++17 标准的字母。AFAIK,你没有任何保证或std::ifstream
成功std::ofstream
工作。
顺便说一句,当前的处理器实际上是多核的,因此尝试并行运行 A 和 B 并执行一些 IPC(以特定于操作系统的方式,可能由某些框架或库抽象)是很有意义的。
推荐阅读
- machine-learning - 多元线性回归 - 回归方程中 X1 的系数和 y 的值?
- c# - 添加到关联表而不加载
- html - 为什么会出现溢出?
- javascript - 为什么 iPhone 显示正确的图像方向而桌面却没有?
- php - 特定端点在升级后的最新 Joomla 上除了默认一种 (en) 以外的所有语言都不起作用 (404)
- python - 将高度数据从 CSV 文件转换为 IMG
- php - 我怎样才能让 gmail smtp 服务器再次工作?
- owl - Protege:等效类定义问题
- apache2 - 访问 apache 2.4 上的服务器信息时出现禁止 (403) 错误
- angular8 - 根据从 Angular 8 的下拉菜单中选择的选项更改对话框的内容