GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cuál es el equivalente a getch() y getche() en Linux?

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

char getch(void)
{
    char buf = 0;
    struct termios old = {0};
    fflush(stdout);
    if(tcgetattr(0, &old) < 0)
        perror("tcsetattr()");
    old.c_lflag &= ~ICANON;
    old.c_lflag &= ~ECHO;
    old.c_cc[VMIN] = 1;
    old.c_cc[VTIME] = 0;
    if(tcsetattr(0, TCSANOW, &old) < 0)
        perror("tcsetattr ICANON");
    if(read(0, &buf, 1) < 0)
        perror("read()");
    old.c_lflag |= ICANON;
    old.c_lflag |= ECHO;
    if(tcsetattr(0, TCSADRAIN, &old) < 0)
        perror("tcsetattr ~ICANON");
    printf("%c\n", buf);
    return buf;
 }

Eliminar el último printf si no desea que se muestre el carácter.


Hay una función getch() en la biblioteca ncurses. Puede obtenerla instalando el paquete ncurses-dev.


Le sugiero que use curses.h o ncurses.h, estos implementan rutinas de administración de teclado, incluido getch(). Tiene varias opciones para cambiar el comportamiento de getch (es decir, esperar a que se presione una tecla o no).


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

static struct termios old, current;

/* Initialize new terminal i/o settings */
void initTermios(int echo) 
{
  tcgetattr(0, &old); /* grab old terminal i/o settings */
  current = old; /* make new settings same as old settings */
  current.c_lflag &= ~ICANON; /* disable buffered i/o */
  if (echo) {
      current.c_lflag |= ECHO; /* set echo mode */
  } else {
      current.c_lflag &= ~ECHO; /* set no echo mode */
  }
  tcsetattr(0, TCSANOW, &current); /* use these new terminal i/o settings now */
}

/* Restore old terminal i/o settings */
void resetTermios(void) 
{
  tcsetattr(0, TCSANOW, &old);
}

/* Read 1 character - echo defines echo mode */
char getch_(int echo) 
{
  char ch;
  initTermios(echo);
  ch = getchar();
  resetTermios();
  return ch;
}

/* Read 1 character without echo */
char getch(void) 
{
  return getch_(0);
}

/* Read 1 character with echo */
char getche(void) 
{
  return getch_(1);
}

/* Let's test it out */
int main(void) {
  char c;
  printf("(getche example) please type a letter: ");
  c = getche();
  printf("\nYou typed: %c\n", c);
  printf("(getch example) please type a letter...");
  c = getch();
  printf("\nYou typed: %c\n", c);
  return 0;
}

Salida:

(getche example) please type a letter: g
You typed: g
(getch example) please type a letter...
You typed: g

Linux
  1. ¿Cuál es el equivalente de C++ para AutoResetEvent en Linux?

  2. ¿Cuál sería el equivalente de Win32 API en Linux?

  3. ¿Cuál es el equivalente Unix/Linux de E/S registrada?

  4. ¿Cuál es el equivalente del comando updatedb de Linux para Mac?

  5. ¿Cuál es el equivalente al comando de archivo de Linux para Windows?

¿Qué es el comando Watch de Linux + ejemplos?

¿Qué es el Shell en Linux?

¿Qué es el comando matar en Linux?

¿Cuál es el equivalente de ~ (tilde) de Linux en Windows?

¿Cuál es el equivalente del comando de Linux sudo fdisk -l en MacOS?

¿Cuál es el equivalente de FreeBSD de Linux update-rc.d?