AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / computer / Perguntas / 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

Como limpar o buffer do teclado?

  • 772

Digamos que um aplicativo estava solicitando a entrada do teclado e eu mantive uma tecla pressionada por um tempo.

Agora, o aplicativo está respondendo às teclas pressionadas, mas fica mais lento à medida que avança.

A idéia é limpar todos esses pressionamentos de tecla recebidos, armazenados em algum lugar em um buffer, para que o aplicativo pare o que está fazendo mal.

linux
  • 2 2 respostas
  • 242 Views

2 respostas

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

    Você deve indicar qual tipo de aplicação: terminal (POSIX syscall, curses, ou stdio API), Qt, Gtk…

    Se for um terminal (syscall) você pode usar o selectsyscall e verificar se algo está disponível na entrada padrão, e enquanto for verdadeiro, leia.

    É mais uma questão de programação.

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

    Vou responder à pergunta do título How to clear the keyboard buffer?no sentido de que tudo o que foi digitado até agora e é percebido como uma entrada que está esperando que um programa o consuma, será limpo, e aqui está como faço isso em um arquivo executável ( ou seja. chmod a+x clrbuf) chamado clrbufque consome silenciosamente a entrada:

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

    Explicação:
    tl;dr: consome silenciosamente todas as entradas e, se não houver entrada, apenas saia após 0,1 segundos (100ms), use sttypara garantir que readnão desabilitou o eco do que o usuário digita, o que pode acontecer em determinados casos.

    Isso está usando o readcomando interno /bin/bash (ou seja, tente $ help readenquanto estiver no bashshell, ou veja este documento ) e usando /bin/stty que é parte do pacote coreutils (no Gentoo).

    Ele vai ler tudo o que está esperando para ser lido e ignorá-lo.
    Por exemplo, se você executar sleep 5 ; clrbuf, começará a digitar algo como a hellotecla +enter e parar de digitar, depois de 5 segundos clrbufserá executado e consumirá o que você digitou, para que o prompt do terminal não receba essa entrada. Assim:

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

    Os argumentos para read:
    O --não é necessário, marca o fim de todos os argumentos, é apenas um hábito para mim.

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

    pois lá está esperando um identificador de variável onde colocar o resultado da leitura.

    -r "não permita que as barras invertidas escapem de nenhum caractere. A barra invertida não atua como um caractere de escape. A barra invertida é considerada parte da linha. Em particular, um par barra invertida-nova linha não pode ser usado como uma continuação de linha." (de help reade desse documento )

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

    -t TIMEOUT "Fazer com que a leitura expire e retorne a falha se uma linha completa de entrada não for lida dentro de TIMEOUT segundos. Esta opção não tem efeito se a leitura não estiver lendo a entrada do terminal ou de um pipe." ( do mesmo documento ). -t 0.1é usado para sair automaticamente readapós 0,1 segundo quando não há entrada pendente para ser consumida.

    -s "Modo silencioso. Se a entrada estiver vindo de um terminal, os caracteres não serão ecoados."( do mesmo documento )
    Por exemplo, se eu digitar "hi"+enter, uma vez:

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

    -e "readline é usado para obter a linha". Por alguma razão, notei que não funciona sem esse argumento. Não me lembro por que, mas observei que é verdade para "GNU bash, versão 5.0.16(1)-maint (x86_64-pc-linux-gnu) commit 3235014e5b3d227ccd617b0be72d897eb476d23d na ramificação devel Data: Seg 20 de abril 10:11:53 2020 -0400". Para o que vale a pena, eu compilei o bash no Gentoo com USE=bundled-readline e talvez seja por isso que ainda funcione sem -epara mim atualmente. Eu não tenho certeza.

    exit 0é sempre certificar-se de retornar o sucesso do script, apenas no caso de clrbufser usado em outro script bash que tenha set -e(o que faria com que esse script saísse se um código de saída diferente de 0 acontecesse após chamar o clrbufscript) (" -e Exit imediatamente se um comando sair com um status diferente de zero. "). Exemplo:

    #!/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
    

    Por que é stty echo echoknecessário?
    Devido a read -s(também conhecido como silencioso) que faz o equivalente a stty -echo -echok(ou seja, desativar echoe echok), para garantir que o usuário nunca fique sem a capacidade de ecoar o que é digitado, em alguns casos, garantimos que o eco é ativado depois de read -sconcluído.
    O exemplo a seguir (c.bash) ilustra quando isso pode acontecer:

    #!/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
    

    A saída é esta:

    $ ./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
    

    Como você pode ver no final -echo -echok, há coisas novas que são definidas (para desabilitadas), em comparação com antes de chamar read -s ... &quando elas foram habilitadas (e, portanto, não impressas por stty). E a última linha stty echo echokirá certificar-se de habilitá-los (observe que eles não têm o -prefixo menos ( ), caso contrário você não verá o que você digita no prompt de comando (ou seja, o eco do que você digita está desabilitado) depois disso script sai.
    Observe que este exemplo não é a única maneira de entrar nesse estado, mas é um exemplo que me ajudou a reproduzir o problema de ter o eco desabilitado quando eu estava usando apenas readto clrbuf, sem stty.

    Uma maneira melhor pode ser salvar o estado do echoe echokantes que o read -s ...seja invocado e, em seguida, restaurar os estados posteriormente. Mas isso é propenso a condições de corrida (se o programa que desativou os ecos os reativa durante nosso read -s, em paralelo) e, portanto, corre o risco de deixar o usuário com o terminal unecoable (quando os sttyrestaura como desativados). Pessoalmente, eu não arriscaria implementar essa variante.

    • 1

relate perguntas

  • Como eu faria minha máquina Linux parecer que está executando o Windows?

  • Existe um equivalente a cd - para cp ou mv?

  • execute o contêiner do docker como root

  • Como ativar o sensor de impressão digital no domínio e no diretório ativo do Linux

  • Como alterar permanentemente Ctrl + C para Ctrl + K no CentOS 7?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como posso reduzir o consumo do processo `vmmem`?

    • 11 respostas
  • Marko Smith

    Baixar vídeo do Microsoft Stream

    • 4 respostas
  • Marko Smith

    O Google Chrome DevTools falhou ao analisar o SourceMap: chrome-extension

    • 6 respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Martin Hope
    Saaru Lindestøkke Por que os arquivos tar.xz são 15x menores ao usar a biblioteca tar do Python em comparação com o tar do macOS? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh Como posso reduzir o consumo do processo `vmmem`? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Pesquisa do Windows 10 não está carregando, mostrando janela em branco 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 Por que uma conexão de Internet gigabit/s via cabo (coaxial) não oferece velocidades simétricas como fibra? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve