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;

0 ответов

Другие вопросы по тегам