我已经有一段时间了,因为我不得不这样做,过去我曾用“spawn”来创建流程。
现在我想异步启动应用程序中的进程,以便我的应用程序继续在后台执行,并且不会因启动进程而停滞不前。
我还希望能够与已启动的流程进行通信。当我启动该过程时,我将向它发送启动程序进程ID,以便启动的进程可以使用它的pid与启动程序通信。
什么是最好的使用方法并非特定于任何平台/操作系统,我正在寻找一个多平台的解决方案?
我用C ++编写这个,我不想要一个能将我与任何第三方许可产品联系起来的解决方案。
我不想使用线程,解决方案必须是创建新进程。
Boost.Process为C ++编程语言提供了一个灵活的框架来管理正在运行的程序,也称为进程。它使C ++开发人员能够执行Java开发人员可以使用java.lang.Runtime / java.lang.Process和.NET开发人员可以使用System.Diagnostics.Process执行的操作。除了其他功能之外,还包括管理当前正在运行的进程的执行上下文的能力,生成新子进程的能力,以及使用标准C ++流和异步I / O与它们进行通信的方法。
该库的设计方式是将所有流程管理细节透明地抽象给用户,从而实现跨平台应用程序的轻松开发。但是,由于此类抽象通常会限制开发人员可以执行的操作,因此该框架允许直接访问特定于操作系统的功能 - 显然会丢失库的可移植性功能。
从站点运行并等待完成子进程的示例代码:
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();
我将插入我自己的小(单头)库:
PStreams允许您从C ++应用程序运行另一个程序,并在两个程序之间传输数据,类似于shell管道。
在最简单的情况下,PStreams类就像POSIX.2函数popen(3)和pclose(3)的C ++包装器一样,使用C ++ iostream而不是C的stdio库。
该库提供了标准iostream样式的类模板,可以与POSIX平台上的任何ISO C ++编译器一起使用。这些类使用streambuf类,它使用fork(2)和exec(2)系列函数来创建一个新进程,并创建最多三个管道来向/从进程写入/读取数据。
std::system便携式推出新工艺。
#include <cstdlib>
int main() {
std::system("./myapp");
return 0;
}
如果您使用Linux并且想要在进程之间共享句柄/内存,那么fork就是您正在寻找的