Ruby STDIN的非阻塞读线?
当正确设置为非阻塞模式时,我不明白为什么IO方法不能在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 {
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
块中
如果事先知道字符/字节的数量,那么库存将很好地发挥作用。@锡人感谢文本更正