Linux tcgetattr, за которым следует tcsetattr, не работает
Мне нужно сохранить атрибуты терминала (tcgetattr), установить для них что-то, что будет блокировать эхо терминала и т. д. (вызов tcsetattr), а затем позже, после работы с устройством фреймбуфера /dev/fb0, восстановить исходные атрибуты (вызов tcsetattr ).
Я обнаружил, что второй вызов tcsetattr всегда завершается ошибкой ввода-вывода, т.е. errno == EIO.
Есть ли какой-то особый трюк, чтобы сделать это?
struct termios originaltermios;
struct termios newtermios;
tcgetattr(console_fd, &originaltermios);
//
newtermios = originaltermios;
tcsdrain(console_fd);
// (change newtermios here)
tcsetattr(console_fd, TCSANOW, &newtermios);
// ... do some stuff for 10-20 seconds with /dev/fd0
if (tcsetattr(console_fd, TCSANOW, &originaltermios)) {
perror("tcsetattr"); // EIO
}
new_termios.c_lflag &= ~ECHO;
new_termios.c_lflag &= ~ISIG;
new_termios.c_lflag &= ~ICANON;
new_termios.c_lflag &= ~IEXTEN;
new_termios.c_iflag &= ~ISTRIP;
new_termios.c_iflag &= ~ICRNL;
new_termios.c_iflag &= ~INLCR;
new_termios.c_iflag &= ~IGNCR;
new_termios.c_iflag &= ~BRKINT;
new_termios.c_iflag &= ~(IXON|IXOFF);
new_termios.c_cc[VMIN] = 0;
new_termios.c_cc[VTIME] = 0;