File Streams&管道数据

时间:2011-08-22 19:58:51

标签: c++ linux unix pipe

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

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

cat myfile.txt | mysort

,输出将是myfile排序的单词。

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

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

我想执行此分析以及程序运行如下:

hugeprog 2>&1 | myanalyzer

2 个答案:

答案 0 :(得分:1)

  

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

只需从stdin读取并写入stdout,您就可以使您的程序适用于将数据传输到其中的任何内容。

你必须在写出时注意缓冲。

修改

  

鉴于hugeprog正在运行并不断生成数据,我该怎么做   在我的应用程序中不断阅读它?

就像您阅读用户的输入一样。我的C ++并不好,但cin.getline应该这样做。在C中我会使用getline /`fgets。

  

我如何知道hugeprog何时会生成流的结束   字符

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

  

此外,如果有一段时间没有输出怎么办?   产生

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

  

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

它会阻止(可能永远)。

答案 1 :(得分:1)

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

fcntl(file_desc,F_SETFL,O_NONBLOCK); //< fcntl.h>

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