我可以编写一个应用程序,将cin中的所有输入复制到容器中(比如说一组),然后将容器内容打印回stdout。在集合的情况下,它们将被排序。
如果我这样做并将其编译为mysort,我可以进入Unix并将该程序用作管道的一部分。
cat myfile.txt | mysort
,输出将是myfile排序的单词。
在这种情况下,直到cat-ing myfile.txt的所有输出都被传送到它之前,mysort才能真正做任何事情。我怎样才能做类似于动态生成的过程数据? (忽略排序;我知道要排序我必须立即获取所有数据才能对其进行排序。)
例如,如果我运行了一个庞大的程序(让我们称之为hugeprog)并且想要在运行时分析该巨大程序的stdout和stderr,我将如何处理我的分析器程序(myanalyzer)的输入?
我想执行此分析以及程序运行如下:
hugeprog 2>&1 | myanalyzer
答案 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>
它会改变一些行为。例如,从该文件读取将始终立即返回,但它可能不包含任何内容,或者它可能只包含等待读取的部分内容,因此您必须调整代码以适应。