抱歉,如果这是一个幼稚的问题,但假设我有一个名为 Ruby 的程序processor.rb
,它以data = STDIN.read
. 如果我像这样调用这个程序
cat textfile.txt | processor.rb
是否STDIN.read
等待cat
将整个管道输入textfile.txt
?或者它是否textfile.txt
为data
变量分配了一些不确定的部分?
我问这个是因为我最近在我的一个程序中看到了一个奇怪的错误,表明后者是这种情况。
read 方法应按原样导入整个文件,并仅在产生输出的过程完成时返回,如管道上的标志所示。在 cat 的输出中,如果您在后续时间调用 read,您将返回 0 个字节。
简单来说,一个进程可以在任何时候附加到它的输出中,就像'tail -f'这样的情况,所以你不能保证你已经从STDIN读取了所有数据而没有实际检查。
不过,您的操作系统实现 cat 或 shell 管道的方式可能略有不同。我不熟悉 POSIX 对这里行为的规定。
可能是行缓冲并读取,直到遇到换行符或 EOF。