C++ 启动另一个进程的最佳方式?

C++ best way to launch another process?

自从我不得不这样做以来已经有一段时间了,过去我使用 "spawn" 创建进程。

现在我想从我的应用程序异步启动进程,以便我的应用程序继续在后台执行并且不会因启动进程而受阻。

我也希望能够与启动的进程进行通信。当我启动进程时,我会向它发送启动器进程 ID,以便启动的进程可以使用它的 pid 与启动器通信。

不特定于任何平台/操作系统的最佳使用方法是什么,我正在寻找一个多平台的解决方案?

我正在用 C++ 编写此代码,我不想要将我与任何第三方许可产品联系在一起的解决方案。

我不想使用线程,解决方案必须是创建新进程。

尝试Boost.Process

Boost.Process provides a flexible framework for the C++ programming language to manage running programs, also known as processes. It empowers C++ developers to do what Java developers can do with java.lang.Runtime/java.lang.Process and .NET developers can do with System.Diagnostics.Process. Among other functionality, this includes the ability to manage the execution context of the currently running process, the ability to spawn new child processes, and a way to communicate with them them using standard C++ streams and asynchronous I/O.

The library is designed in a way to transparently abstract all process management details to the user, allowing for painless development of cross-platform applications. However, as such abstractions often restrict what the developer can do, the framework allows direct access to operating system specific functionality - obviously losing the portability features of the library.

运行 的示例代码并等待站点的子进程完成:

bp::child c(bp::search_path("g++"), "main.cpp");

while (c.running())
    do_some_stuff();

c.wait(); //wait for the process to exit   
int result = c.exit_code();

我会插入我自己的小(单个 header)库:

PStreams 允许您从 C++ 应用程序 运行 另一个程序,并在两个程序之间传输数据,类似于 shell 管道。

在最简单的情况下,PStreams class 就像 POSIX.2 函数 popen(3) 和 pclose(3) 的 C++ 包装器,使用 C++ iostreams 而不是 C 的 stdio 库.

该库提供 class 标准 iostream 样式的模板,可与 POSIX 平台上的任何 ISO C++ 编译器一起使用。 classes 使用一个 streambuf class,它使用 fork(2) 和 exec(2) 系列函数创建一个新进程,并创建最多三个管道到 write/read 数据 to/from过程。

一个可移植的启动新进程是std::system

#include <cstdlib>

int main() {
   std::system("./myapp");
   return 0;
}

如果您使用 linux 并且想在进程之间共享 handles/memory,fork 就是您要找的东西