2

抱歉,如果这是一个幼稚的问题,但假设我有一个名为 Ruby 的程序processor.rb,它以data = STDIN.read. 如果我像这样调用这个程序

cat textfile.txt | processor.rb

是否STDIN.read等待cat将整个管道输入textfile.txt?或者它是否textfile.txtdata变量分配了一些不确定的部分?

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

4

2 回答 2

2

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

简单来说,一个进程可以在任何时候附加到它的输出中,就像'tail -f'这样的情况,所以你不能保证你已经从STDIN读取了所有数据而没有实际检查。

不过,您的操作系统实现 cat 或 shell 管道的方式可能略有不同。我不熟悉 POSIX 对这里行为的规定。

于 2009-12-30T16:08:15.667 回答
0

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

于 2009-12-30T15:56:42.853 回答