【问题标题】:File Streams & Piping Data文件流和管道数据
【发布时间】:2011-08-22 19:58:50
【问题描述】:

我可以编写一个应用程序,将所有输入从 cin 复制到一个容器(比如说一个集合)中,然后将容器内容打印回标准输出。在集合的情况下,它们将被排序。

如果我这样做并将其编译为 mysort,我可以进入 Unix 并将程序用作管道的一部分。

cat myfile.txt | mysort

输出将是 myfile 中排序后的单词。

在这种情况下,直到 cat-ing myfile.txt 的所有输出都通过管道传输到它之后,mysort 才能真正做任何事情。我怎样才能做类似于动态生成的过程数据的事情? (忽略排序;我知道要排序,我必须同时拥有所有数据才能对其进行排序)。

例如,如果我运行一个巨大的程序(我们称它为 hugeprog)并想在该大型程序运行时分析它的 stdout 和 stderr,我将如何处理分析器程序(myanalyzer)的输入?

我想在程序运行时执行此分析,如下所示:

hugeprog 2>&1 | myanalyzer

【问题讨论】:

    标签: c++ linux unix pipe


    【解决方案1】:

    我将如何处理分析器程序的输入 (分析仪)?

    通过简单地从stdin 读取并写入stdout,您将使您的程序与任何将数据通过管道传输到其中/从其中传输出来的东西一起工作。

    您只需要在写出时注意缓冲。

    编辑

    鉴于 hugeprog 正在运行并不断产生数据,我该如何 在我的应用中持续阅读?

    就像您读取用户的输入一样。我的 C++ 不是很好,但 cin.getline 应该可以。在 C 语言中,我会使用 getline / `fgets.

    我如何知道 hugeprog 何时会生成流结束 人物

    生成那个角色不是他的工作。这只是操作系统告诉您没有更多输入的人为方式。

    另外,如果有一段时间没有输出怎么办 生产出来的

    你等待/建立一个计时器,当它用完时你退出并出错。

    在有数据之前,我的 cin 调用会阻塞还是会导致 问题

    它将阻塞(可能永远)。

    【讨论】:

    • 我应该更详细一点。鉴于 hugeprog 正在运行并不断产生数据,我如何在我的应用程序中不断读取它?我应该做一个while循环来寻找流结束字符来结束程序吗?我怎么知道 hugeprog 何时会生成流结束字符(或者它在管道上终止时是否是默认值?)。另外,如果有一段时间没有产出怎么办?我的 cin 调用会阻塞直到有数据出现还是会导致问题?
    • 为了避免缓冲,如果输出行缓慢,则来自 hugeprog 的 stdout,或者如果后面跟着另一个管道,则来自 myanalyzer 的 stdout,请参阅答案 stackoverflow.com/questions/1000674/turn-off-buffering-in-pipe/… 中的“unbuffer”或从 @ 滚动你自己的987654322@.
    【解决方案2】:

    我认为您可能仍会遇到缓冲问题。如果你真的想要响应,你可以尝试使用 fcntl 在你的标准输入文件句柄上设置 O_NONBLOCK。

    fcntl(file_desc, F_SETFL, O_NONBLOCK); //

    它会改变一些行为。例如,从该文件读取总是会立即返回,但它可能不包含任何内容,或者可能只包含等待读取的部分内容,因此您必须调整代码以适应。

    【讨论】:

      猜你喜欢
      • 2019-05-29
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 2017-03-29
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      相关资源
      最近更新 更多