概述
Boost.Process提供了一个灵活的C++ 进程管理框架。它允许C++ developer可以像Java和.Net程序developer那样管理进程。它还提供了管理当前执行进程上下文、创建子进程、用C++ 流和异步I/O进行通信的能力。
该库以完全透明的方式将所有进程管理的抽象细节呈现给使用者,且该库是跨平台的。
特点
进程管理
Boost.Process的长期目标是提供一个抽象于操作系统之上的,可以管理任何运行的进程的框架。由于提供这样的API比较困难,所以现在只专注于管理。Boost.Process的最重要的特征就是启动一个外部应用、控制它们并与它们交互。传统上讲,对于C和C++ 来说,就比较困难了,因为它们要启动新进程、执行外部程序、建立匿名管道来交互、等待进程结束、检查进程退出码等。更糟糕的是不同操作系统,相关的进程模块和API是不同的。所以,Boost.Process的出现就提供了便利条件。
输入输出重定向
一般来说一个应用启动了子进程,它们可能会通过传输数据来交流。这种进程间通信是文件句柄层面的,通常涉及stdin、stdout、stderr。如果操作系统支持,那么就需要可重定向的流。不过这对C++ 来说是很容易的。
不同操作模式
支持同步、异步、分离
管道管理
这样就可以实现一个进程的输出可以作为另一个进程的输入。
库的设计图
最重要的类就是Context和Process。Context提供了进程运行的上下文。pistream和postream是为了交互。父进程还可以等待子进程退出,并检查进程退出码。如果有例如包含管道的shell命令要执行,那么pipeline_entry就应运而生了,它可以实现前一个子进程的输出是下一个子进程的输入。
使用步骤
1、创建上下文Context
2、创建子进程,获得子进程对象
3、如果有重定向,可以访问到stdin、stdout、stderr
4、进程结束,检查进程退出码
教程
一个最简单的例子
|
下面再看一个异步的例子
|
这个例子中用到了asio库,涉及到许多回调函数。关于异步(asio)暂时不做讲解,写这个例子是为了展示该库的异步功能。对异步感兴趣的同学可以看一下《Boost.Asio C++ Network Programming》
部分文件和类
stream_behaviour.hpp文件
对于流的描述,可分为六种类型
序号 | 流描述 | 含义 |
---|---|---|
1 | capture | 父子进程之间通过无名管道相互接收数据 |
2 | close | 启动时关闭 |
3 | inherit | 父子进程共用一个,也即继承 |
4 | redirect_to_stdout | 主要用在stderr时,重定向到stdout |
5 | silence | 输出重定向到/dev/null |
6 | posix_redirect | 将输出重定向到指定的文件描符,是对redirect_to_stdout的扩展 |
以下是等价的
boost::process::child::get_stdin() <==> boost::process::posix_child::get_input(STDIN_FILENO)
boost::process::child::get_stdout() <==> boost::process::posix_child::get_output(STDOUT_FILENO)
boost::process::child::get_stderr() <==> boost::process::posix_child::get_output(STDERR_FILENO)
重定向的例子
|
boost::process::context类
|
而basic_work_directory_context是用来设置工作目录的;environment_context实质上是个包装了boost::process::environment的类,boost::process::environment是一个map<string, string>,用以保存环境变量。
boost::process::posix_context类
|
函数boost::process::self::get_environment()可以得到当前进程的环境变量。
我们可以对环境变量进行修改,如
boost::process::environment_context env;
env.insert(boost::process::environment::valuetype(“A”, “a”));
进程结束码类信息
|
进程类对象信息
|
children类
children类实际上std::vector<child>。children的启动方式是一个输出流被链接到下一个子进程的输入流上。
|
需要注意的是,wait_children出错时,返回第一个子进程的退出码,所有子进程都正常退出时,返回最后一个子进程的退出码。
master3中大量用到进程管理这个库。这个Boost.Process库可以在这里获得点这里。