2015-03-25 4 views
0

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

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

Есть ли способ, с помощью которого «scanf» не прерывается, потому что при операции чтения и записи на последовательном порту?

+0

EINTR - это ошибка, а не сигнал – Bhuvanesh

+0

Вы можете попробовать 'NONBLOCK' для получения ввода. Это не поможет вам избежать этого. –

+0

Да, EINTR - это ошибка. – Pratham

ответ

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^