- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在用 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/
我想创建一个可以编译的 Java 项目的 jar 文件。我在互联网上查看过,但所有关于如何执行此操作的示例似乎都需要一个 java 文件并对其进行处理。我想将 java 项目的根目录打包到 jar 中
当我添加一个左连接来获取外部表的计数时,它将我的其他左连接表的总和值乘以计数,我也不能在这里使用不同的总和,因为两个值可以相同: SELECT c.id as company_id, SUM(ct.a
我在 AppEngine 上托管了一个简单的 ReSTLet 服务。这对字符串执行基本的 CRUD 操作,并且当我用 curl 测试它时(对于所有动词),它可以很好地处理各种 UTF-8 字符。 这由
我是一名优秀的程序员,十分优秀!