跳转至

Process 可移植创建进程

1 system和spawn

  • 使用boost::process::system()阻塞创建进程
  • 使用boost::process::spawn()不阻塞创建进程
  • 简单示例
#include <boost/process.hpp>
using namespace boost::process;
int main()
{
    //功能:使用gcc 编译hello.cpp文件
    boost::process::system("g++ hello.cpp", boost::process::std_out >"gcc_out.log" );
    //功能:打开Code.exe(vscode)
    boost::process::system("Code");
    //spawn不阻塞调用
    boost::process::spawn("Code");
    //search_path用于查找可执行程序路径
    boost::process::spawn(boost::process::search_path("Code"));
}

2 参数风格

  • system和spawn函数参数风格分2大类cmd和Exe/Args,可细分3类
  • 风格1:一条字符串包含所有信息,如bp::system("gcc --version");
  • 风格2:多条字符串分割可执行程序路径和参数信息,如bp::system("D:/MinGW/bin/gcc.exe", "--version");
  • 风格3:使用命名参数指定参数,如bp::system(bp::exe = "D:\\MinGW\\bin\\gcc.exe", bp::args = "--version");
  • 注意事项:
  • 当采用风格2和3时,可执行程序路径要全,如gcc路径D:\\MinGW\\bin\\gcc.exe,不能仅仅指示可执行程序名,如gcc
  • 示例:system和spawn具有相同规则
#include <boost/process.hpp>
using namespace boost::process;
int main()
{
    //风格1:一条字符串包含所有信息
    bp::system("gcc --version");
    //风格2:多条字符串分割可执行程序路径和参数信息 ;注意事项:gcc.exe路径要填写
    bp::system("D:/MinGW/bin/gcc.exe", "--version");
    //风格3:使用命名参数指定参数 ,参数顺序无限制;注意事项:bp::cmd路径信息可只写gcc,但bp::exe路径要写D:\\MinGW\\bin\\gcc.exe
    bp::system(bp::cmd = "gcc --version");
    bp::system(bp::exe = "D:\\MinGW\\bin\\gcc.exe", bp::args = "--version");
    bp::system(bp::args = "--version",bp::exe = "D:\\MinGW\\bin\\gcc.exe"); 
}

3 进程的输入输出流

  • 输出流 std_outstd_err
  • 输入流 std_in
  • 简单示例
#include <boost/process.hpp>
#include <boost/process/windows.hpp>
#include <string>
#include <iostream>
namespace bp = boost::process;
using namespace boost::process;
using namespace std;
int main()
{
    //把gcc版本信息输出到文件gcc_version.txt中
    bp::system("gcc --version", bp::std_out > "gcc_version.txt");
    //把gcc版本信息输出到文件ipstream管道流中
    {
        bp::ipstream ips;
        std::string line,info;
        bp::system("gcc --version", bp::std_out > ips);     
        while (std::getline(ips,line))
        {
            info += line+"\n";
        }
        std::cout << info;
    }
}