在Linux终端中是否有用于按键的预先输入缓冲区?

时间:2013-07-24 15:22:35

标签: linux unix terminal keypress termios

Linux是否在终端中输入了密钥,以便您以后可以读取一次一个键



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

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

有两个相互矛盾的案例:

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

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

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

1 个答案:

答案 0 :(得分:0)

您应该阅读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模式,请查看其所在模式的转义序列。您可能会发现,过多地依赖终端特定的转义码会将您的程序限制为一种特定的终端类型。