很抱歉,如果这是一个天真的问题,但我们假设我有一个名为processor.rb
的Ruby程序,以data = STDIN.read
开头。如果我像这样调用这个程序
cat textfile.txt | processor.rb
STDIN.read
是否等待cat
管道整个textfile.txt
?或者它是否将textfile.txt
的某些不确定部分分配给data
变量?
我问这个是因为我最近在我的一个程序中看到一个奇怪的错误,表明后者就是这种情况。
答案 0 :(得分:2)
read方法应按原样导入整个文件,并仅在生成输出的进程完成时返回,如管道上的标志所示。应该是这样的情况,在cat的输出中,如果你在后续时间调用read,你将返回0个字节。
简单来说,一个进程可以随时附加到它的输出,就像'tail -f'这样的东西,所以你无法保证你已经读过STDIN的所有数据而没有实际检查。
但是,您的操作系统可能会略微区别地实现cat或shell管道。我不熟悉POSIX在这里所要求的行为。
答案 1 :(得分:0)
可能是行缓冲并读取,直到遇到换行符或EOF。