LINUX.ORG.RU

Чтение символа в консоли


0

0

Нужно в консоли считывать символы следующим образом:

Если клавиша не нажата, то ждем. Если нажали любую клавишу, то вернуть ее код.

getchar() ждет нажатия enter.

Чем можно таоке проделать?

★★★★

это терминал себя так ведет. Нужно дисциплинировать терминал. Типа stty, але ioctl какой сделать

dilmah ★★★★★
()
Ответ на: комментарий от fmjs

> отрубить буферизацию stdin-а, каким-нибудь setbuf-ом

буферизация в самой программе или ее библиотеках -- здесь ни при чем. Это терминал буферизирует..

dilmah ★★★★★
()

#include <ctype.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <sys/poll.h>

struct termios tp;

void
reset_term (int x)
{
  tcsetattr (0, TCSANOW, &tp);
  exit (x);
}

int
main ()
{
  char key[2];
  int tp_if, tp_of, tp_lf;
  int r;
  struct pollfd ufds;           /* only one, no need for an array... */

  key[0] = key[1] = '\0';

  signal (SIGTERM, reset_term);

  tcgetattr (0, &tp);
  tp_if = tp.c_iflag;
  tp_of = tp.c_oflag;
  tp_lf = tp.c_lflag;
  tp.c_iflag = 0;
  tp.c_oflag &= ~OPOST;
  tp.c_lflag &= ~(ISIG | ICANON | ECHO);
  tcsetattr (0, TCSANOW, &tp);
  tp.c_iflag = tp_if;
  tp.c_oflag = tp_of;
  tp.c_lflag = tp_lf;

  ufds.events = POLLIN;
  ufds.fd = 0;

  while (1)
    {
      r = poll (&ufds, 1, 1000);
      if (r == 0) continue;
      if (r > 0)
        {
          read (0, key, 1);
          if (key[0] == 3 || key[0] == 4) reset_term (1);
          if (key[0] != 0) reset_term (key[0]);
        }
    }
}

ananas ★★★★★
()
Ответ на: комментарий от dilmah

помог такой код:

struct termios t;
int fn;

fn = fileno(stdin);

tcgetattr(fn, &t);
t.c_lflag &=~(ICANON | ECHO);
tcsetattr(fn, TCSANOW, &t);

после чего fread(&ch, 1, 1, stdin); дает нужный результат.

Всем спасибо :)

alexru ★★★★
() автор топика

>Чем можно таоке проделать?

man tcsetattr /ICANON

еще почитайте man ncurses для разнообразия

Murr ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.