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

时间:2019-04-03 08:17:37

标签: c++ fork spawn

已经有一段时间了,因为我不得不这样做,过去我使用“ spawn”来创建流程。

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

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

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

我是用C ++编写的,我不希望有一种将我与任何第三方许可产品联系在一起的解决方案。

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

3 个答案:

答案 0 :(得分:2)

尝试Boost.Process

  

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是您要寻找的