Como posso capturar as teclas digitadas de solteiro em um aplicativo de console unix sem bloquear?

StackOverflow https://stackoverflow.com/questions/184108

  •  06-07-2019
  •  | 
  •  

Pergunta

Eu tenho um servidor TCP muito simples escrito em C. Ele é executado indefinidamente, aguardando conexões. No Windows, eu uso select para verificar se há atividade no socket, e se não houver qualquer, eu tenho o seguinte código para permitir-me para sair por bater 'q' no teclado:

if( kbhit() ) {
   char c = getch();
   if( c == 'q' ) break;
}

Esta não funciona em Unix, desde kbhit não existe e getch funciona de forma diferente. Eu encontrei alguns código de exemplo que usos tcsetattr para alterar as configurações do terminal e permitir a entrada caractere por caractere. Depois de chamar a função init, abro / dev / stdin (com O_NONBLOCK) e ler um personagem, mas blocos read( f, &c, 1 ) até que um personagem é hit.

Acho que eu poderia gerar um segmento separado e têm it esperar indefinidamente e, em seguida, sinalizar o primeiro segmento se os acessos de usuários 'q', mas que parece um pouco pesada. Certamente há uma maneira mais fácil?

Foi útil?

Solução

Adicionar stdin à sua lista de selecionados alças, e se ele tem dados, chamada de leitura para ler um caractere a partir dele.

Outras dicas

Em vez disso, adicionar "f" do seu

read( f, &c, 1 )

para selecionar chamada. Quando f está pronto para leitura, um personagem foi pressionado, e ler () não irá bloquear.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top