Linux 是否会缓冲在终端中输入的键,以便您稍后可以一次一个键读取它们?
我问这个问题是因为我想捕捉 ESC 和箭头键的按下情况,但找不到可靠地读取代码的方法。我将终端置于非规范模式,并希望程序在没有输入时阻塞,但如果有输入,我只想获取一个按键进行处理。
更新 2:箭头键只是一个示例。我需要识别按键,即使是对于我的程序具有未知转义序列的按键。
有两种相互冲突的情况:
read(1) 返回一个字符。对于功能键和 ESC 键,该字符均为 0x1b。要检查它是否是方向键,您需要读取(1),如果只按下单个 ESC,它将被阻止。
解决方案:阻塞读(1)、非阻塞读(1)
问题:如果第二次读取与任何功能键都不匹配,则可能意味着它是缓冲的 ESC 后跟一些序列,或者是未知的功能键。如何检测未知功能键的按下?read(4) 最多返回 4 个字符,但如果按 ESC 四次让它缓冲,您将得到一个由四个 0x1b 组成的字符串。与上面相同的问题来确定是否有未知的功能键被按下。
任何人都可以解释如何在 Linux 终端中处理这些问题,或者至少发布一个证明 Linux 没有 key 输入缓冲区?
最佳答案
您应该阅读 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 参数,但如果我输入 <ESC>[X
将成功工作(对于 A、B、C、D 中的 X)。
如果您的终端不处于 VT100 模式,请查找其所处模式的转义序列。您可能会意识到,过多依赖终端特定的转义代码会将您的程序限制为一种特定的终端类型。
关于linux - Linux 终端中是否有用于按键的预输入缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17838339/