Функция 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