Emulação da kbhit() no Linux

1. Emulação da kbhit() no Linux

Perfil removido
removido

(usa Nenhuma)

Enviado em 23/06/2017 - 21:37h

EDIT: Nem sei se o termo emulação está correto.

Encontrei esse código para kbhit() no Linux.
Não sei se é uma forma sadia de implementação.
Ainda aquela história da tal função que lê teclas ...
Qualquer coisa pode ser melhor que ncurses.
Quanto mais for em recursos em C ou do sistema, melhor.

O que dizer?

/*
* [dkbhit.c]
* Simula a função kbhit().
*
* [Autor]
* Daemonio (Marcos Paulo Ferreira)
* undefinido at gmail com
* https://daemoniolabs.wordpress.com
*
* Versão 1.0, by daemonio @ Thu Dec 27 20:40:22 BRST 2012
*/
#include <stdio.h>
#include <unistd.h>
#include <termios.h>

void init_attr(void) ;
void close_attr(void) ;
int kbhit(void) ;

struct termios old_attr, new_attr;

void init_attr(void) {
/* Obtém as configurações atuais. */
tcgetattr(0,&old_attr);
new_attr=old_attr;

/* Desliga modo canônico. */
new_attr.c_lflag &=~ICANON ;

/* Desliga ecoamento. */
new_attr.c_lflag &= ~ECHO;

new_attr.c_cc[VTIME]=0 ;
new_attr.c_cc[VMIN]=0 ;
}

/* Retorna configurações antigas. */
void close_attr(void) {
tcsetattr(STDIN_FILENO,TCSANOW,&old_attr);
}

int kbhit(void) {
int c ;

tcsetattr(STDIN_FILENO,TCSANOW,&new_attr);
c = getchar() ; /* retorna EOF se nada foi pressionado */
tcsetattr(STDIN_FILENO,TCSANOW,&old_attr);

return c ;
}

int main(void) {
int flag_ler_nome = 0;
char nome[20] ;

init_attr() ;

while(1) {
flag_ler_nome = kbhit() ;

if(flag_ler_nome != EOF) {
printf("Digite seu nome: ") ;
fgets(nome, sizeof nome, stdin) ;
}

printf("** Outros processamentos **\n") ;
}

close_attr() ;

return 0;
}

/* EOF */



EDIT:

É outra coisa. Nada a ver. Apenas para eu não perder o código.

#include <ncurses.h>

int main(void) {
initscr(); /* Start curses mode */
printw("Hello, World!"); /* Print Hello. World! */
refresh(); /* Print it on to the real screen */
getch(); /* Wait for user input */
endwin(); /* End curses mode */
return 0;
}



  


2. Re: Emulação da kbhit() no Linux

Paulo
paulo1205

(usa Ubuntu)

Enviado em 24/06/2017 - 00:22h

Com o modo canônico do terminal desligado, kbhit() é somente isto aqui.

#include <poll.h>    // poll(), struct pollfd e POLLIN
#include <unistd.h> // STDIN_FILENO

bool kbhit(){
struct pollfd pollstdin={STDIN_FILENO, POLLIN, 0};
return poll(&pollstdin, 1, 0)==1;
}


A versão que você mostrou está “errada”, se comparada à do Turbo C. A versão do Turbo C apenas checava se havia caracteres disponíveis para a leitura, mas não os lia.

Além disso, a versão que você mostrou mistura temerariamente I/O em baixo nível com funções de <stdio.h>. Ou uma coisa, ou outra.

Veja minhas respostas a um tópico de teor semelhante: https://www.vivaolinux.com.br/topico/C-C++/Como-ler-dados-do-teclado-sem-interromper-execucao-do-pro... (particularmente a resposta nº 8).






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts