Ruby STDIN的非阻塞读线?

Ruby STDIN的非阻塞读线?,ruby,unix,stdin,pipe,Ruby,Unix,Stdin,Pipe,当正确设置为非阻塞模式时,我不明白为什么IO方法不能在STDIN上工作: require 'fcntl' stdin_flags = STDIN.fcntl(Fcntl::F_GETFL) p stdin_flags #32770 p STDIN.fcntl(Fcntl::F_SETFL, stdin_flags | Fcntl::O_NONBLOCK) # 0 p STDIN.fcntl(Fcntl::F_GETFL) # 34818 #at_exit {

当正确设置为非阻塞模式时,我不明白为什么IO方法不能在STDIN上工作:

  require 'fcntl'

  stdin_flags = STDIN.fcntl(Fcntl::F_GETFL)
  p stdin_flags   #32770
  p STDIN.fcntl(Fcntl::F_SETFL, stdin_flags | Fcntl::O_NONBLOCK) # 0
  p STDIN.fcntl(Fcntl::F_GETFL)    # 34818
  #at_exit { STDIN.fcntl(Fcntl::F_SETFL, stdin_flags & ~Fcntl::O_NONBLOCK) }
  STDIN.readline    # this call blocks, IO::EAGAINWaitReadable expected
  exit
IO.fcntl
成功设置非阻塞模式,但所有IO功能,如
读取
读取线
获取
读取字符
忽略该模式,并在未收到输入时在读取时挂起

将同步模式设置为true无效

如果我用shell调用
system('readline')
替换
STDIN.readline
,它确实可以正常工作。它不会等待或将等待输入,这取决于是否设置了非阻塞模式

我知道IO.read\u nonblock,但正在寻找一种有效的方法来读取以换行符结尾的字符串。为每个字符调用
read\u nonblock
,速度非常慢


有人能解释这种(mis)行为吗?

这有点不幸,但来自
IO
模块的标准函数似乎不尊重与文件描述符关联的状态标志

工作解决方案之一是使用类方法进行输入轮询,然后在可用时使用常规方法读取数据。 请注意,当使用行处理方法时,代码可能会挂起,直到使用终止的换行符为止。当事情失去控制时,建议将轮询代码包含在
Timeout
块中

如果事先知道字符/字节的数量,那么库存将很好地发挥作用。

@锡人感谢文本更正