Emulando o comportamento de getch()

Olá,

Nos sistemas operacionais Windows, existe a biblioteca chamada conio.h que disponibiliza a função getch(). Essa função tem a característica de ler os caracteres digitados no terminal sem mostrar, ao usuário, o que está sendo digitado. Essa situação ótima em algumas situações, onde não se deseja que outras pessoas saibam o que vc está escrevendo, por exemplo, uma senha.

Infelizmente, as distribuições Linux não apresenta suporte a essa biblioteca de C. No entanto, podemos emular o comportamento dessa função, criando a nossa própria função para isso. Essa função exige uma manipulação do buffer de entrada padrão.  A seguir, uma função que apresenta o mesmo comportamento de getch().

#include <stdio.h>
#include <termios.h> 
#include <unistd.h>

#define END_FILE_CHARACTER 0x04  /* ctrl-d - fim de arquivo */

int emul_getch (void) 
{
  struct termios oldstuff;
  struct termios newstuff;
  int    inch;

  tcgetattr(STDIN_FILENO, &oldstuff);
  newstuff = oldstuff;                         /* salva todos os atributos */
  newstuff.c_lflag &= ~(ICANON | ECHO);        /* apaga as flags "canonical", "echo" */
  tcsetattr(STDIN_FILENO, TCSANOW, &newstuff); /* configura novos atributos */
  inch = getchar();
  tcsetattr(STDIN_FILENO, TCSANOW, &oldstuff); /* restaura os atributos antigos */

  if (inch == END_FILE_CHARACTER) {
    inch = EOF;
  }
  return inch;
}
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s