如何将数据发送到另一个进程(仅在 C++ 语言级别)
How can you send data to another process (at the c++ language level only)
假设您正在开发两个应用程序(A 和 B)。
如果只允许在 c++ 语言级别工作(包括标准库和 STL),如何从 A 向 B 发送一些信息?
现在我在想 std::ofstream 和 std::ifstream 可能是一个可能的解决方案(尽管是粗略的)? - 但是有什么陷阱,可以避免吗? (如何?)。
你就是做不到。标准 C++17 不知道任何类型的进程间通信,也不太了解进程(除了通过 std::system
whose behavior is not really specified). Some operating systems 没有任何进程,其中一些没有文件和一些没有管道。
阅读有关操作系统的更多信息。我强烈推荐 Operating Systems: Three Easy Pieces(免费提供)。
当然,你可以读写一个文件,但是两个进程之间的同步应该还是会发生(也许是运行一个接一个,在一些特定于操作系统的方式,所以 运行 A 然后 B,具体如何发生是 OS 特定的)
阅读 C++17 标准(例如草案 here)进行检查。
一些 C++17 实现可能甚至没有任何进程的概念。您可以在某些嵌入式系统上拥有完全兼容的 C++17,而无需任何操作系统处理进程。
我的建议是务实,并使用一些框架,例如Boost, Qt, ZeroMQ, or POCO (or old Berkeley sockets),它处理进程和进程间通信设施;您可能会找到一个支持您真正关心的几个 OS 的框架(AFAIK,所有 Boost、POCO、Qt 都知道 Linux、Windows、MacOSX 并提供一个通用的 API 抽象它们;但是你可以找到一些与它们不兼容的学术操作系统;在实践中,任何同时针对 Windows 和 POSIX 的框架都应该是实际上足够了)。
出于好奇,您可能会发现一个具有良好 C++17 实现的 OS,它有一个非常奇怪的 API(例如 GNU Hurd)。
如果您的 IPC 工具基于字节流,请查看 text-based protocols (perhaps JSONRPC、SOAP、HTTP 等)。它们更易于编码,并且大多数都带有一些 C++ 兼容库...
经过几个月的工作和大量的知识,您甚至可以将最近的 GCC 或 Clang 移植到大多数其他操作系统:他们小心翼翼地将 OS 的要求抽象为一个聪明的方法。
请记住,您可能会发现 OSes 甚至没有任何 file system: look into CapROS or Contiki for some recent example, and look also inside tunes.org where interesting discussions related to your topic, in the past century, have been archived. But with some pain (my guess is a few months of work for a GCC or Clang expert), you'll be able to port a recent GCC or Clang 来定位它以获得针对它们的 C++17 交叉编译器。
恕我直言,C++ 标准库仅支持 "open" 一个 "file"(假设命名为 THEFILE
)符合 C++17 标准的字母。据我所知,您没有任何 保证 std::ifstream
或 std::ofstream
成功运行。
顺便说一句,当前的处理器实际上是多核的,因此并行尝试 运行 A 和 B 并进行一些 IPC 很有意义(以 OS 特定方式,也许由某些框架或库抽象。
假设您正在开发两个应用程序(A 和 B)。
如果只允许在 c++ 语言级别工作(包括标准库和 STL),如何从 A 向 B 发送一些信息?
现在我在想 std::ofstream 和 std::ifstream 可能是一个可能的解决方案(尽管是粗略的)? - 但是有什么陷阱,可以避免吗? (如何?)。
你就是做不到。标准 C++17 不知道任何类型的进程间通信,也不太了解进程(除了通过 std::system
whose behavior is not really specified). Some operating systems 没有任何进程,其中一些没有文件和一些没有管道。
阅读有关操作系统的更多信息。我强烈推荐 Operating Systems: Three Easy Pieces(免费提供)。
当然,你可以读写一个文件,但是两个进程之间的同步应该还是会发生(也许是运行一个接一个,在一些特定于操作系统的方式,所以 运行 A 然后 B,具体如何发生是 OS 特定的)
阅读 C++17 标准(例如草案 here)进行检查。
一些 C++17 实现可能甚至没有任何进程的概念。您可以在某些嵌入式系统上拥有完全兼容的 C++17,而无需任何操作系统处理进程。
我的建议是务实,并使用一些框架,例如Boost, Qt, ZeroMQ, or POCO (or old Berkeley sockets),它处理进程和进程间通信设施;您可能会找到一个支持您真正关心的几个 OS 的框架(AFAIK,所有 Boost、POCO、Qt 都知道 Linux、Windows、MacOSX 并提供一个通用的 API 抽象它们;但是你可以找到一些与它们不兼容的学术操作系统;在实践中,任何同时针对 Windows 和 POSIX 的框架都应该是实际上足够了)。
出于好奇,您可能会发现一个具有良好 C++17 实现的 OS,它有一个非常奇怪的 API(例如 GNU Hurd)。
如果您的 IPC 工具基于字节流,请查看 text-based protocols (perhaps JSONRPC、SOAP、HTTP 等)。它们更易于编码,并且大多数都带有一些 C++ 兼容库...
经过几个月的工作和大量的知识,您甚至可以将最近的 GCC 或 Clang 移植到大多数其他操作系统:他们小心翼翼地将 OS 的要求抽象为一个聪明的方法。
请记住,您可能会发现 OSes 甚至没有任何 file system: look into CapROS or Contiki for some recent example, and look also inside tunes.org where interesting discussions related to your topic, in the past century, have been archived. But with some pain (my guess is a few months of work for a GCC or Clang expert), you'll be able to port a recent GCC or Clang 来定位它以获得针对它们的 C++17 交叉编译器。
恕我直言,C++ 标准库仅支持 "open" 一个 "file"(假设命名为 THEFILE
)符合 C++17 标准的字母。据我所知,您没有任何 保证 std::ifstream
或 std::ofstream
成功运行。
顺便说一句,当前的处理器实际上是多核的,因此并行尝试 运行 A 和 B 并进行一些 IPC 很有意义(以 OS 特定方式,也许由某些框架或库抽象。