当输入来自管道时,STDIN.read会一直运行直到达到EOF吗?

时间:2009-12-30 15:52:49

标签: ruby unix pipe stdin

很抱歉,如果这是一个天真的问题,但我们假设我有一个名为processor.rb的Ruby程序,以data = STDIN.read开头。如果我像这样调用这个程序

cat textfile.txt | processor.rb

STDIN.read是否等待cat管道整个textfile.txt?或者它是否将textfile.txt的某些不确定部分分配给data变量?

我问这个是因为我最近在我的一个程序中看到一个奇怪的错误,表明后者就是这种情况。

2 个答案:

答案 0 :(得分:2)

read方法应按原样导入整个文件,并仅在生成输出的进程完成时返回,如管道上的标志所示。应该是这样的情况,在cat的输出中,如果你在后续时间调用read,你将返回0个字节。

简单来说,一个进程可以随时附加到它的输出,就像'tail -f'这样的东西,所以你无法保证你已经读过STDIN的所有数据而没有实际检查。

但是,您的操作系统可能会略微区别地实现cat或shell管道。我不熟悉POSIX在这里所要求的行为。

答案 1 :(得分:0)

可能是行缓冲并读取,直到遇到换行符或EOF。