已经有一段时间了,因为我不得不这样做,过去我使用“ spawn”来创建流程。
现在,我想从应用程序异步启动进程,以便我的应用程序继续在后台执行,并且不会因启动进程而受阻。
我还希望能够与启动的进程进行通信。启动进程时,我将向其发送启动器进程ID,以便启动的进程可以使用其pid与启动器进行通信。
不是特定于任何平台/操作系统的最佳使用方法是什么,我正在寻找一种多平台解决方案?
我是用C ++编写的,我不希望有一种将我与任何第三方许可产品联系在一起的解决方案。
我不想使用线程,解决方案必须是创建新进程。
答案 0 :(得分:2)
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();
答案 1 :(得分:0)
我将插入自己的小(单个标头)库:
PStreams允许您从C ++应用程序中运行另一个程序,并在两个程序之间传输类似于Shell流水线的数据。
在最简单的情况下,PStreams类就像POSIX.2函数popen(3)和pclose(3)的C ++包装器,使用C ++ iostream而不是C的stdio库。
该库提供了标准iostream样式的类模板,可以与POSIX平台上的任何ISO C ++编译器一起使用。这些类使用一个streambuf类,该类使用fork(2)和exec(2)函数家族创建一个新进程,并最多创建三个管道来向该进程写入数据/从该进程读取数据。
答案 2 :(得分:-1)
启动新进程的便携式计算机是std::system。
#include <cstdlib>
int main() {
std::system("./myapp");
return 0;
}
如果您使用linux,并且希望在进程之间共享句柄/内存,那么fork是您要寻找的