【发布时间】:2014-09-08 14:15:25
【问题描述】:
当正确设置为非阻塞模式时,我无法弄清楚为什么 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 函数,如 read、readline、gets、readchar 忽略该模式并在未收到输入时挂起读取。
将同步模式设置为 true 无效。
如果我用 shell 调用 system('read line') 替换 STDIN.readline,它确实可以正常工作。它不会等待或将等待输入,具体取决于是否设置了非阻塞模式。
我知道IO.read_nonblock,但正在寻找一种有效的方法来读取换行符终止的字符串。为每个字符调用read_nonblock 非常缓慢。
谁能解释这种(错误)行为?
【问题讨论】:
-
@the Tin Man 感谢文字更正