gpt4 book ai didi

ruby - STDIN 的非阻塞读取线?

转载 作者:数据小太阳 更新时间:2023-10-29 07:35:57 25 4
gpt4 key购买 nike

当正确设置为非阻塞模式时,我不明白为什么 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 函数如 readreadlinegets , readchar 忽略模式并在未收到输入时挂起读取。

将同步模式设置为 true 无效。

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

我知道 IO.read_nonblock 但正在寻找一种有效的方式来读取换行符终止的字符串。为每个单个字符调用 read_nonblock 非常慢。

谁能解释这种(错误)行为?

最佳答案

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

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

如果事先知道字符/字节的数量,库存 IO.read_nonblock只会很好地服务。

关于ruby - STDIN 的非阻塞读取线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25726343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com