У меня есть небольшое приложение, написанное на C, предназначенное для работы в Linux. Часть приложения принимает пользовательский ввод с клавиатуры и использует неканонический режим терминала, чтобы он мог реагировать на каждое нажатие клавиши.Проблема с терминалом Linux с неканоническим терминальным приложением ввода/вывода
Раздел кода, который принимает входные данные является простой функцией, которая вызывается многократно в цикле:
char get_input()
{
char c = 0;
int res = read(input_terminal, &c, 1);
if (res == 0) return 0;
if (res == -1) { /* snip error handling */ }
return c;
}
Это считывает один символ из терминала. Если вход не получен в течение определенного таймфрейма (указанный значением c_cc [VTIME] в termios struct), read() возвращает 0, а get_input() вызывается снова.
Все это отлично работает, за исключением того, что недавно я обнаружил, что если вы запустите это приложение в окне терминала, а затем закройте окно терминала, не прекратив приложения, приложение не выйдет, а запускается в интенсивный цикл с интенсивным использованием процессора, read() непрерывно возвращает 0 без ожидания.
Итак, как я могу закрыть приложение, если оно запущено из окна терминала, а затем окно терминала закрыто? Проблема в том, что read() никогда не возвращает -1, поэтому условие ошибки неотличимо от нормального случая, когда read() возвращает 0. Таким образом, единственное решение, которое я вижу, - это поставить таймер и предположить, что существует условие ошибки, если read возвращает 0 быстрее, чем время, указанное в c_cc [V_TIME]. Но в лучшем случае это решение кажется взломанным, и я надеялся, что есть лучший способ справиться с этой ситуацией.
Любые идеи или предложения?