gpt4 book ai didi

ruby - Ruby 退出后,STDIN.read_nonblock 会扰乱其他程序

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:32:36 28 4
gpt4 key购买 nike

我正在用 Ruby 编写一个交互式终端程序,它有时会运行 STDIN.read_nonblock(256) 来刷新所有缓冲的用户输入。

运行我的 Ruby 程序后,如果我在同一个终端和 shell 中运行 git add -p(另一个交互式程序),那么 git 会发生故障:它不会花任何时间等待用户输入而是立即显示所有提示然后退出。

这是一个 shell session ,展示了我如何使用 Ubuntu 18.04、Ruby 2.6.3 和 git 2.17.1 重现它:

$ mkdir testrepo && cd testrepo && git init .
Initialized empty Git repository in /home/david/tmp/testrepo/.git/
$ touch foo.txt
$ git add foo.txt
$ echo hi > foo.txt
$ git add -p # works fine
diff --git a/foo.txt b/foo.txt
index e69de29..45b983b 100644
--- a/foo.txt
+++ b/foo.txt
@@ -0,0 +1 @@
+hi
Stage this hunk [y,n,q,a,d,e,?]? q

$ ruby -v -e 'STDIN.read_nonblock(256)'
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
Traceback (most recent call last):
2: from -e:1:in `<main>'
1: from <internal:prelude>:73:in `read_nonblock'
<internal:prelude>:73:in `__read_nonblock': Resource temporarily unavailable - read would block (IO::EAGAINWaitReadable)
$ git add -p # bad: exits before waiting for input
diff --git a/foo.txt b/foo.txt
index e69de29..45b983b 100644
--- a/foo.txt
+++ b/foo.txt
@@ -0,0 +1 @@
+hi
Stage this hunk [y,n,q,a,d,e,?]?
$ git --version
git version 2.17.1

我可以在我的 Ruby 程序中加入任何解决方法来防止这种情况发生吗? (我也对任何可能发生的事情感兴趣。)

顺便说一下,我注意到可以通过运行 bash 启动一个新的 shell,然后键入 Ctrl+D 退出那个新的 shell 来修复困惑的终端。

最佳答案

除了您自己的答案之外,还有一种方法可以将描述符上的 O_NONBLOCK 重置为阻塞。这也解决了这个问题:

require 'fcntl'

flags = STDIN.fcntl(Fcntl::F_GETFL, 0)
STDIN.fcntl(Fcntl::F_SETFL, flags & ~Fcntl::O_NONBLOCK)

您必须在 ensure block 中运行此代码,因为 read_nonblock 在任何情况下都不会重置标志。

关于ruby - Ruby 退出后,STDIN.read_nonblock 会扰乱其他程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57170899/

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