q
задерживается в драйвере / буфере слоя TTY ядра , потому что он находится в режиме "готово".
В этом режиме приложение будет возвращать что-либо в приложение только тогда, когда драйвер увидит новую строку. Затем он возвращает: q\n
(т.е. q<newline>
).
Чтобы он немедленно возвращался на любом символе, вам придется использовать вызовы ioctl
, чтобы перевести слой TTY в «сырой» режим.
Вам нужно будет использовать [рекомендуемые] вызовы termios
: tcgetattr
и tcsetattr
.
UPDATE:
Будет ли работать только ioctl? Какая команда соответствует для перевода терминала в режим raw?
Посмотрите на man termios
. В нем есть полная документация о том, как установить необработанный режим (так называемый неканонический режим на странице руководства).
Прошло много времени с тех пор, как я это сделал, но вот функция скелета.
Хотя функция восстанавливает исходное состояние в конце, вы можете установить неканонический режим один раз при запуске программы.
Но тогда вам придется обрабатывать все свои собственные редактирование строк (например, поддержку возврата и т. Д.) Для других разделов вашей программы, которые хотят нормального канонического редактирования строк.
#include <termios.h>
#include <unistd.h>
void
change_tty(int fd)
{
struct termios orig;
struct termios raw;
// get original cooked/canonical mode values
tcgetattr(fd,&orig);
// set options for raw mode
raw = orig;
#if 0
raw.c_lflag &= ~ICANON;
raw.c_cc[VMIN] = ...
raw.c_cc[VTIME] = ...
#else
cfmakeraw(&raw);
#endif
// put unit into raw mode ...
tcsetattr(fd,TCSANOW,&raw);
// do stuff in raw mode ...
// restore original mode
tcsetattr(fd,TCSANOW,&orig);
}