0

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



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

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

有两种相互矛盾的情况:

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

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

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

4

1 回答 1

0

您应该阅读VT100 转义序列

您已经发现转义按钮的字符代码(作为真实字符发送,但往往几乎专门用于表示转义序列的开始)是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 参数,但如果我键入<ESC>[X(对于 A、B、C、D 中的 X),它将成功运行。

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

于 2013-07-24T15:41:54.753 回答