【问题标题】:Is there a typeahead buffer for key presses in Linux terminal?Linux终端中的按键是否有预输入缓冲区?
【发布时间】:2013-07-24 04:25:37
【问题描述】:

Linux 是否缓冲 keys 在终端中键入,以便您以后可以一次读取一个键



我问是因为我想捕捉 ESC 和箭头键按下,但找不到可靠读取代码的方法。我将终端置于非规范模式,如果没有输入,希望程序阻塞,但如果有,我只想获取一个按键进行处理。

更新 2:箭头键只是一个示例。即使对于我的程序具有未知转义序列的键,我也需要识别按键。

有两种相互冲突的情况:

  • read(1) 返回一个字符。对于功能键和 ESC 键,此字符均为 0x1b。要检查它是否是箭头键,您需要读取(1),如果只按单个 ESC,它将阻塞。
    解决方案:阻塞读取(1),非阻塞读取( 1)
    问题:如果第二次读取没有匹配任何功能键,这可能意味着它是缓冲的 ESC 后跟一些序列,或未知的功能键。如何检测未知功能按键?

  • read(4) 最多返回 4 个字符,但是如果你按 ESC 四次让它缓冲,你会得到一个 4 个 0x1b 的字符串。同上查找是否有未知功能键的问题。

任何人都可以解释如何在 Linux 终端中处理这些问题,或者至少发布一个证明 Linux 只是没有键输入缓冲区的证据吗?

【问题讨论】:

    标签: linux unix terminal keypress termios


    【解决方案1】:

    你应该阅读VT100 escape sequences

    您发现转义按钮的字符代码(作为真实字符发送,但往往几乎专门用于表示转义序列的开始)是0x1b

    To move the cursor UP:    <ESC>[{COUNT}A
    To move the cursor DOWN:  <ESC>[{COUNT}B
    To move the cursor RIGHT: <ESC>[{COUNT}C
    To move the cursor LEFT:  <ESC>[{COUNT}D
    

    您可以通过在终端中输入它们自己来测试它们。只需一个接一个地键入键。我的终端无法识别 count 参数,但如果我输入 &lt;ESC&gt;[X(对于 A、B、C、D 中的 X),它将成功运行。

    如果您的终端未处于 VT100 模式,请查找其所处模式的转义序列。您可能会意识到,过多地依赖终端特定的转义码会将您的程序限制为一种特定的终端类型。

    【讨论】:

    • 光标键只是一个例子。我也需要读取未知键。
    • 我不知道你所说的“未知键”是什么意思。
    • “未知键”是我不知道此系统上正确转义序列的键。我在示例中阐明了这一点。
    • 如果您点击链接并了解所有转义序列,则不会有任何未知键。
    • 这仅适用于 VT100 终端。我需要以通用方式检测 Linux 中按下的键盘键,而无需编写额外的驱动程序代码来翻译每种可用终端类型的代码。
    猜你喜欢
    • 2015-11-04
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 2012-06-13
    • 2020-11-27
    相关资源
    最近更新 更多