Функция scanf и сигнал EINTR

Я работаю на платформе Linux. У меня есть консольное многопоточное приложение, которое загружает многопоточную библиотеку общих объектов для других функций. Библиотека разделяемых объектов внутренне открывает последовательный порт для связи. Библиотека использует системные вызовы "open", "read" и "write" Linux для последовательной связи. Последовательная связь использует обработчик сигнала для получения данных. Основной поток в консольном приложении ожидает оператора scanf, чтобы получить ввод от пользователя.

Всякий раз, когда на последовательном порту происходит какое-либо действие, генерируется сигнал, из-за которого вызов scanf прерывается с помощью EINTR (прерванный системный вызов).

Есть ли способ, которым 'scanf' не будет прерван из-за операций чтения-записи на последовательном порту?

1 ответ

Если вы установите обработчик сигнала с SA_RESTART флаг, read() а также write() звонки не возвращаются EINTR ошибки в Linux; и не будет scanf() семейство стандартных функций ввода / вывода (как они используют read() внутри). Подробности смотрите в разделе man 7 signal "Прерывание системных вызовов и библиотечных функций обработчиками сигналов". Хотя это поведение зависит от системы, все другие Unix-подобные системы, которые я использовал, ведут себя одинаково. - Nominal Animal

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