Программа зависает после обработки SIGWINCH

Просто для удовольствия я пытаюсь написать библиотеку, которая делает все, что делает ncurses, используя iostreams и отправляя escape-последовательности прямо в терминал.

Я пытаюсь обработать SIGWINCH, чтобы сообщить библиотеке, когда размер терминала изменяется. Программа отвечает нормально, пока я не изменяю размер терминала, затем он перестает отвечать на ввод, даже CTRL-C (хотя я не обрабатываю SIGINT, и имею терминал в «сыром» режиме, используя termios).

Вот некоторые фрагменты кода, которые я скопировал из своего кода, чтобы показать, как я настроил обработчик сигнала.

void handle_sigwinch(int sig)
{
if(sig == SIGWINCH)
{
// set a flag here
}
}
void setup_signals()
{
struct sigaction new_sig_action;
new_sig_action.sa_handler = handle_sigwinch;
sigemptyset (&new_sig_action.sa_mask);
new_sig_action.sa_flags = 0;
sigaction (SIGWINCH, NULL, &old_sig_action_);
if (old_sig_action_.sa_handler != SIG_IGN)
{
sigaction (SIGWINCH, &new_sig_action, NULL);
}
}

int main()
{
setup_signals();
int ch;
// exit if ctrl-c is pressed
while((ch == cin.get()) != 3)
{
if(ch > 0)
cout << (char)ch;
}
}

Я настроил свой код в соответствии с примером, представленным на https://www.gnu.org/software/libc/manual/html_node/Sigaction-Function-Example.html#Sigaction-Function-Example для настройки обработчика сигнала.

Есть ли что-то, что я не смог сделать после обработки SIGWINCH, из-за чего моя программа перестала работать?

Редактировать: я пропустил код, где я настраивал терминал, используя cfmakeraw и tcsetattr, и перед этим я отправил escape-последовательность для перевода xterm в режим альтернативного буфера обмена.

0

Решение

Благодаря комментарию nos я нашел через отладчик, что программа работает нормально, но cin.get() больше не получал действительные данные. Поэтому я изменил свой поиск в Google с «программа зависает после обработчика сигнала» на «поток ввода прерван после обработчика сигнала» и нашел этот ответ на StackOverflow, который позволил мне понять, что входной поток находился в состоянии ошибки после вызова обработчика сигнала.

Я поставил проверку перед вводом, чтобы игнорировать символьное значение -1 (я, должно быть, думал о библиотеке Arduino read заявление, когда я это сделал, где -1 — это индикатор того, что вход недоступен). Таким образом, программа в основном игнорировала ошибки в потоке ввода. (Я отредактировал код моего вопроса, чтобы отразить это упущение).

Я поместил cin.clear() Оператор сразу перед прочтением в цикле, и теперь программа работает как положено.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]