Boost C++ 库

...世界上最受尊敬和设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

PrevUpHomeNext

全局 std_out

boost::process::v1::std_out

概要

// In header: <boost/process/v1/io.hpp>

unspecified std_out;

描述

此属性允许设置子进程的输出流。

[Note] 注意

语义与 std_err 相同。

[Note] 注意

std_errstd_out 可以使用 operator & 组合成一个流,例如 std_out & std_err

详情

文件输入

文件 I/O 简单地将流重定向到文件,可能的文件类型如下:

  • boost::process::v1::filesystem::path

  • std::basic_string<char_type>

  • const char_type*

  • FILE*

其中 char_type 可以是 charwchar_t

显式添加了 FILE*,因此进程可以轻松地将子进程的输出流重定向到进程的另一个输出流。 也就是说:

system("ls", std_out < stdin);
[Warning] 警告

如果启动进程和子进程都使用输入,则会导致未定义的行为。

由于 C++ 实现未提供对句柄的访问,因此像 system("ls", std_out > std::cerr) 这样的语法是不可行的。

此属性的有效表达式是:

std_out < file;
std_out = file;

管道输出

如相应部分所述,boost.process 库提供了一个 async_pipe 类,可用于与子进程通信。

[Note] 注意

从技术上讲,async_pipe 在这里的工作方式类似于同步管道,因为库在这里没有使用 asio 实现。 但是,如果进程完成,异步操作将不会结束,因为管道仍然打开。 您可以使用带有 on_exit 的 async_close 函数来解决此问题。

使用管道的有效表达式如下:

std_out > pipe;
std_out = pipe;

其中,pipe 的有效类型如下:

请注意,管道也可以在多个进程之间使用,如下所示:

pipe p;
child c1("nm", "a.out", std_out>p);
child c2("c++filt", std_in<p);

异步管道输出

异步管道 I/O 将通信分类为由进程库自动处理异步操作。 这意味着将构造一个管道,自动启动 async_read/-write,并且子进程的结束也将关闭管道。

管道 I/O 的有效类型如下:

  • boost::asio::mutable_buffer [31]

  • boost::asio::streambuf

  • std::future<std::vector<char>>

  • std::future<std::string>

使用管道的有效表达式如下:

std_out > buffer;
std_out = buffer;
std_err > buffer;
std_err = buffer;
(std_out & std_err) > buffer;
(std_out & std_err) = buffer;
[Note] 注意

boost::asio::buffer 也在 boost::process 命名空间中可用。

[Warning] 警告

此功能需要包含 boost/process/async.hpp 并将 boost::asio::io_context 的引用传递给启动函数。

关闭

可以关闭输出流,使其无法写入。 如果尝试写入,则会导致错误。

可以通过以下语法来实现:

std_out > close;
std_out = close;
std_out.close();

可以将输出流重定向为写入 null 设备,这意味着所有输出都将被丢弃。

实现此目的的语法具有以下变体:

std_out > null;
std_out = null;
std_out.null();



[31] 使用 boost::asio::buffer 构造


PrevUpHomeNext