boost:进程管理

Boost.Process为C++开发者提供了一个跨平台的进程管理框架,简化了启动、控制和与进程交互的过程。它支持输入输出重定向、多种操作模式(同步、异步、分离)以及管道管理。库的主要类包括Context和Process,用于创建和管理进程。此外,该库还允许对环境变量进行操作,并提供与子进程的stdin、stdout和stderr的交互。
摘要由CSDN通过智能技术生成

概述

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、进程结束,检查进程退出码

教程

一个最简单的例子

#include <boost/filesystem.hpp>
#include <boost/process.hpp>
#include <string>
#include <vector>
 
namespace bp = ::boost::process;
 
bp::child start_child()
{
     std::string exec = "bjam" ;
     std::vector<std::string> args;
     args.push_back( "bjam" );
     args.push_back( "--version" );
 
     bp::context ctx;
     ctx.stdout_behavior = bp::capture_stream();
 
     return bp::launch(exec, args, ctx);
}
 
int main()
{
     bp::child c = start_child();
 
     bp::pistream &is = c.get_stdout();
     std::string line;
     while (std::getline(is, line))
         std::cout << line << std::endl;
     bp::status s = c.wait();
 
     return s.exited() ? s.exit_status() : EXIT_FAILURE;
}

下面再看一个异步的例子

#include <boost/filesystem.hpp>
#include <boost/asio.hpp>
#include <boost/process.hpp>
#include <boost/array.hpp>
#include <boost/bind.hpp>
#include <string>
#include <vector>
#include <iostream>
 
namespace bp = ::boost::process;
namespace ba = ::boost::asio;
 
ba::io_service io_service;
boost::array< char , 4096> buffer;
 
ba::posix::stream_descriptor in(io_service);
 
bp::child start_child()
{
     std::string exec = "bjam" ;
 
     std::vector<std::string> args;
     args.push_back( "bjam" );
     args.push_back( "--version" );
 
     bp::context ctx;
     ctx.stdout_behavior = bp::capture_stream();
     ctx.environment = bp::self::get_environment();
 
     return bp::launch(exec, args, ctx);
}
 
void end_read( const boost:: system ::error_code &ec, std:: size_t bytes_transferred);
 
void begin_read()
{
     in.async_read_some(boost::asio::buffer(buffer),
         boost::bind(&end_read, ba::placeholders::error, ba::placeholders::bytes_transferred));
}
 
void end_read( const boost:: system ::error_code &ec, std:: size_t bytes_transferred)
{
     if (!ec)
     {
         std::cout << std::string(buffer.data(), bytes_transferred) << std::flush;
         begin_read();
     }
}
 
int main()
{
     bp::child c = start_child();
 
     bp::pistream &is = c.get_stdout();
     in.assign(is.handle().release());
 
     begin_read();
     io_service.run();
 
    
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值