#include <fcntl.h> #include <termios.h>
struct termios savetty; struct termios tty;
if ( !isatty(0) ) { /*Проверка: стандартный ввод - терминал?*/ fprintf (stderr, "stdin not terminal\n"); exit (1); /* Ст. ввод был перенаправлен на файл, канал и т.п. */ }; tcgetattr (0, &tty); savetty = tty; /* Сохранить упр. информацию канонического режима */ tty.c_lflag &= ~(ICANON|ECHO|ISIG); tty.c_cc[VMIN] = 1; tcsetattr (0, TCSAFLUSH, &tty);
Внимание. С данного момента клавиатурный ввод начинает работать в неканоническом режиме. При этом отключается эхо-вывод на экран вводимых символов, а также подавляется генерация сигналов специальными комбинациями клавиш (типа ^С, ^\).
Предупреждение. Если Ваша программа завершит свою работу, не восстановив канонический режим (например, аварийно), то Вы вряд ли сможете продолжить продуктивную работу с оболочкой UNIX с данного терминала. Поэтому рекомендуется определить обработчик сигналов для наиболее распространенных ошибок, восстанавливающий канонический режим перед завершением программы. Восстановить канонический режим можно также попытаться с помощью команд reset или stty sane.
read (0, &ch, 1);
tcsetattr (0, TCSAFLUSH, &savetty);
#include <fcntl.h> #include <termios.h> #include <stdio.h> main (argc, argv) int argc; char **argv; { struct termios savetty; struct termios tty; char ch; int x, y; printf ("Enter start position (x y): "); scanf ("%d %d", &x, &y); if ( !isatty(0) ) { fprintf (stderr, "stdin not terminal\n"); exit (1); }; tcgetattr (0, &tty); savetty = tty; tty.c_lflag &= ~(ICANON|ECHO|ISIG); tty.c_cc[VMIN] = 1; tcsetattr (0, TCSAFLUSH, &tty); printf ("%c[2J", 27); fflush (stdout); printf ("%c[%d;%dH", 27, y, x); fflush (stdout); for(;;) { read (0, &ch, 1); if (ch == 'q') break; switch (ch) { case 'u': printf ("%c[1A", 27); fflush (stdout); break; case 'd': printf ("%c[1B", 27); fflush (stdout); break; case 'r': printf ("%c[1C", 27); fflush (stdout); break; case 'l': printf ("%c[1D", 27); fflush (stdout); break; }; }; tcsetattr (0, TCSAFLUSH, &savetty); exit (0); }