Я испытываю проблему, связанную с SIGIO, в программе на C ++, над которой я работаю.
- Платформа: Linux 2.6.30, x86 Arch
- Сценарий: асинхронная последовательная связь.
Я последовал этому примеру асинхронной связи из инструкции по последовательному программированию в Linux, и он работал безупречно.
Затем я удалил «sleep + check wait_flag» и теперь обрабатываю часть read () непосредственно в signal_handler_IO (). То есть, когда какой-либо вход доступен, вызывается обработчик сигнала, и он вызывает чтение через последовательный порт (*).
Кажется, мой код работает, но, к сожалению, когда доступен новый вход, сигнал SIGIO повышается несколько раз, поэтому я получаю ложные / неполные чтения (каждый полученный SIGIO вызывает чтение).
Я изменил Последовательные параметры VMIN и VTIME для управления буфером чтения (т. Е. VMIN = 255 / VTIME = 15, VMIN = 50 / VTIME = 0, ...). Я попытался установить флаг SA_SIGINFO (как предлагалось некоторыми), но безуспешно.
Итак:
- что я упускаю при поднятии / обработке SIGIO?
- есть ли способ избежать этого "шторма SIGIO"?
- есть ли способ контролировать политику повышения SIGIO?
Заранее спасибо.
Bye.
(*): на самом деле я следую этой подсказке C ++ FAQ Lite , поэтому обработчик сигнала вызывает функцию-член объекта, которая инкапсулирует все мои последовательные элементы обработки. К сожалению, проблема все еще возникает, даже если я вызываю read () в самом обработчике сигнала.