增压管的目的是什么,为什么它很重要?

  • 本文关键字:是什么 c++ boost stream
  • 更新时间 :
  • 英文 :


如果这个问题过于宽泛,我深表歉意。我是c++的新手,试图理解不同的流类型以及为什么它们重要(或不重要)。

我正在通过编写一个简单的程序来学习,该程序启动子进程,并处理输出。我遵循Boost进程同步IO示例:https://www.boost.org/doc/libs/1_75_0/doc/html/boost_process/tutorial.html#boost_process.tutorial.io.

其中一个例子可以简化为:

#include <boost/process.hpp>
using namespace std;
using namespace boost::process;
int main(int argc, char *argv[]) {
opstream in;
ipstream out;
child c("c++filt", std_out > out, std_in < in);
in << "_ZN5boost7process8tutorialE" << endl;
in.pipe().close(); // This will help c++filt quit, so we don't hang at wait() forever
c.wait();
return 0;
}
我的问题是:

为什么我们必须使用boost opstream?我可以使用istringstream代替(除了它不编译)?可以用istringstream编译吗?

Boost文档说:

提振。Process提供了管道流(ipstream, opstream, pstream)来封装管道,并提供了std::istream, std::ostream和std::iostream接口的实现。

作为pipe是否重要,即pipe是否有显著意义?

什么是过程,它们如何对话?

程序以各种方式与其环境交互。一组通道是标准输入、输出和错误流。

这些通常通过shell (cmd.exe, sh, bash等)绑定到终端或文件。

现在如果程序相互交互,如:

ls | rev

列出文件并将输出发送到另一个程序(rev,它反转每一行),这是通过管道实现的。管道是一个操作系统的特性,而不是一个提升的想法。所有主要的操作系统都有。

有趣的事实:|操作符在大多数shell中用于指示进程之间的这种类型的输出/输入重定向,称为PIPE符号。

什么是管道,那么?

管道基本上是"神奇的"。引用"IO通道"的文件描述符;而不是文件。管道有两端:一方可以向一端写入数据,另一方可以从另一端读取数据。

为什么?

我马上想到了两个原因

  • 文件需要磁盘IO和同步,这使得它很慢

    另一个有趣的事实:MSDOS已经根据临时文件(磁盘上)实现管道很长时间了:

    MS-DOS 2.0引入了将一个程序的输出作为另一个程序的输入的管道的能力。由于MS-DOS是一个单任务操作系统,因此模拟的方法是将第一个程序的输出重定向到一个临时文件并运行它直到完成,然后运行第二个程序,其输入从该临时文件重定向。现在突然间,MS-DOS需要一个位置来创建临时文件!无论出于何种原因,MS-DOS的作者选择使用TEMP变量来控制这些临时文件的创建位置。

  • 该管道启用异步IO。在进程具有双向(全双工)IO的情况下,这一点非常重要。

ok Do I Care?

是的,不,也许。

你多半不会。ipstream/opstream类与std::istream/std::ostream100%兼容,所以如果你有一个需要它们的函数:

void simulate_input(std::ostream& os)
{
for (int i = 0; i < 10; ++i) {
os << "_ZN5boost7process8tutorialE" << std::endl;
}
}

您可以在示例中完美地使用它:

bp::opstream in;
bp::ipstream out;
bp::child c("c++filt", bp::std_out > out, bp::std_in < in);
simulate_input(in);
in.close();
c.wait();

当你真的需要它

在全双工的情况下,当两个程序都在等待另一端的输入时,你很容易导致死锁,因为它们正在同步地做IO。

你可以在这里找到例子和解决方案:

  • 如何重现死锁提示的Boost过程文档?
  • boost::process::child在关闭输入流后不会退出
  • Boost::处理管道流和单元测试

相关内容

  • 没有找到相关文章

最新更新