Ruby 为什么从管道读取16kb+1字节会挂起?

Ruby 为什么从管道读取16kb+1字节会挂起?,ruby,unix,jruby,pipe,Ruby,Unix,Jruby,Pipe,我有一个简单的测试用例,用于读取通过MRI但在JRuby 1.7+中失败的管道。据报道,这是一个严重的错误 tl;dr为什么从管道中完全读取16kb 16384字节的文件而16kb+1字节的文件失败?在另一个系统上,发现阈值为72kb 73728字节 $ ruby testpipe.rb 16384 Starting...didn't hang! $ ruby testpipe.rb 16385 Starting...^C 某些操作系统或JVM缓冲区大小是否会导致向IO.select发送不同的信

我有一个简单的测试用例,用于读取通过MRI但在JRuby 1.7+中失败的管道。据报道,这是一个严重的错误

tl;dr为什么从管道中完全读取16kb 16384字节的文件而16kb+1字节的文件失败?在另一个系统上,发现阈值为72kb 73728字节

$ ruby testpipe.rb 16384 Starting...didn't hang! $ ruby testpipe.rb 16385 Starting...^C 某些操作系统或JVM缓冲区大小是否会导致向IO.select发送不同的信号


另外,我与的作者进行了双重检查,他认为我对IO.select等的使用是正确的。

来自linux管道手册页:管道容量管道的容量有限。如果管道已满,则write2将阻塞或失败,具体取决于是否设置了O_NONBLOCK标志,请参见下文。不同的实现对管道容量有不同的限制。应用程序不应依赖于特定的容量:应用程序的设计应使读取过程在数据可用时立即消耗数据,从而使写入过程不会保持阻塞状态。因为16384是两个数字的魔力之一,所以可能是你达到了系统强加的极限。在Linux上进行验证。