AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1702703
Accepted
Stephane
Stephane
Asked: 2022-02-03 00:39:51 +0800 CST2022-02-03 00:39:51 +0800 CST 2022-02-03 00:39:51 +0800 CST

如何清除键盘缓冲区?

  • 772

假设一个应用程序要求键盘输入,我按住一个键一会儿。

现在应用程序正在响应按键,但随着进程的进行而变慢。

这个想法是清除所有这些传入的按键,存储在缓冲区的某个位置,以便让应用程序停止它做得不好的事情。

linux
  • 2 2 个回答
  • 242 Views

2 个回答

  • Voted
  1. Best Answer
    Frédéric Loyer
    2022-02-03T01:17:58+08:002022-02-03T01:17:58+08:00

    您必须指明应用程序的类型:终端(POSIX 系统调用、curses 或 stdio API)、Qt、Gtk...

    如果它是一个终端(系统调用),您可以使用select系统调用并验证标准输入上是否有可用的东西,如果是真的,请阅读它。

    这更像是一个编程问题。

    • 1
  2. correabuscar
    2022-10-13T03:22:45+08:002022-10-13T03:22:45+08:00

    我将How to clear the keyboard buffer?在某种意义上回答标题问题,即到目前为止键入的所有内容并被视为等待程序使用它的输入,都将被清除,这就是我在可执行文件中的操作方式( ie. chmod a+x clrbuf) 被调用clrbuf,它默默地消耗输入:

    #!/bin/bash
    read -r -t 0.1 -s -e --
    stty echo echok
    exit 0
    

    说明:
    tl;dr:静默消耗所有输入,如果没有输入,则在 0.1 秒(100 毫秒)后退出,然后用于stty确保read没有禁用用户键入内容的回显,这可能在某些情况下发生案例。

    这是使用 /bin/bash 的内部read命令(即$ help read在bashshell 中尝试,或查看此文档)并使用 /bin/stty 这是 coreutils 包的一部分(在 Gentoo 上)。

    它将读取所有等待读取的内容并忽略它。
    例如,如果您运行,sleep 5 ; clrbuf然后您开始输入类似hello+enter 键并停止输入,然后在 5 秒后clrbuf运行并吃掉您输入的内容,因此之后的终端提示不会获得该输入。像这样:

    $ sleep 5; clrbuf
    hello
    
    $ sleep 5; notclrbuf
    hello
    bash: notclrbuf: command not found
    $ hello
    bash: hello: command not found
    

    的论点read:不需要,它标志着所有论点的结束,这对我来说只是一个习惯。
    --

    $ read -r --
    
    $ read -- -r
    bash: read: `-r': not a valid identifier
    

    因为它需要一个变量标识符来放置读取的结果。

    -r “不允许反斜杠转义任何字符。反斜杠不充当转义字符。反斜杠被认为是行的一部分。特别是,反斜杠换行对不能用作行继续。” help read(来自那个文档)

    $ read -- a ; echo $a
    \\
    \
    
    $ read -r -- a ; echo $a
    \\
    \\
    

    -t TIMEOUT “如果在 TIMEOUT 秒内未读取完整的输入行,则导致读取超时并返回失败。如果读取不是从终端或管道读取输入,则此选项无效。”(来自同一文档)。-t 0.1用于在 0.1 秒后自动退出,read当没有输入待处理时。

    -s “静默模式。如果输入来自终端,则不会回显字符。”(来自同一个文档)
    例如,如果我键入“hi”+enter,则一次:

    $ sleep 5; read  -r -t 0.1  -e -- 
    hi
    hi
    
    $ sleep 5; read  -r -t 0.1 -s -e -- 
    hi
    

    -e “readline 用于获取行”。出于某种原因,我注意到没有这个论点它是行不通的。我不记得为什么,但我注意到“GNU bash,版本 5.0.16(1)-maint (x86_64-pc-linux-gnu) commit 3235014e5b3d227ccd617b0be72d897eb476d23d on devel branch 日期:4 月 20 日星期一 10:11:53 2020 -0400”。值得一提的是,我在 Gentoo 上使用 USE=bundled-readline 编译了 bash,也许这就是为什么它-e目前对我来说仍然有效。我不确定。

    exit 0是始终确保从脚本返回成功,以防万一clrbuf在另一个 bash 脚本中使用set -e(如果在调用脚本后发生不同于 0 的退出代码,这将导致该脚本退出clrbuf)(“ -e 立即退出如果命令以非零状态退出。")。例子:

    #!/bin/bash
    
    set -e
    test 20 == 0
    #^ our script will exit due to the above, because the above returned exit code 1
    
    echo Done
    #^ this is not reached
    

    为什么stty echo echok需要?
    由于read -s(又名静默)相当于stty -echo -echok(即禁用echo和echok),为了确保用户永远不会无法回显键入的内容,在某些情况下,我们确保回显完成后启用read -s。
    以下示例 (c.bash) 说明了何时可能发生这种情况:

    #!/bin/bash
    
    stty
    for i in 1 2 3 4; do
      echo 'a' & #required
      read -r -t 0.1 -s -- &
      #echo "$?" #is 0
    done
    wait
    stty
    stty echo echok
    

    输出是这样的:

    $ ./c.bash 
    speed 38400 baud; line = 0;
    erase = ^H;
    -brkint -imaxbel iutf8
    a
    a
    a
    a
    speed 38400 baud; line = 0;
    erase = ^H;
    -brkint -imaxbel iutf8
    -echo -echok
    

    正如您在最后看到的那样,与在启用它们时-echo -echok调用之前相比read -s ... &(因此 stty 根本不打印),设置了新的东西(禁用)。最后一行stty echo echok将确保启用它们(请注意,它们缺少减号 ( -) 前缀),否则之后您将看不到您在命令提示符下键入的内容(即禁用回显您键入的内容)脚本退出。
    请注意,此示例不是进入此状态的唯一方法,但它是一个示例,它帮助我重现了当我只使用readto时禁用 echo 的问题clrbuf,而没有stty.

    更好的方法可能是在调用之前保存echoand的状态,然后再恢复状态。但这很容易出现竞争条件(如果禁用回声的程序在我们的并行期间重新启用它们),因此可能会给用户留下不可回声的终端(当我们将它们恢复为禁用时)。就个人而言,我不会冒险实施这个变体。echokread -s ...read -sstty

    • 1

相关问题

  • 如何让我的 Linux 机器看起来像是在运行 Windows?

  • 对于 cp 或 mv,是否有等同于 cd - 的东西?

  • 以 root 身份运行 docker 容器

  • 如何在域和 Linux 活动目录中启用指纹传感器

  • 如何在CentOS 7 中将Ctrl+C 永久更改为Ctrl+K?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve