Linux: проблема нескольких SIGIO (асинхронная последовательная связь) - PullRequest
0 голосов
/ 11 января 2010

Я испытываю проблему, связанную с 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 () в самом обработчике сигнала.

1 Ответ

4 голосов
/ 11 января 2010

Вы звоните read в обработчике сигналов? Это плохо. Очень немногие функции безопасны для асинхронного сигнала . Шторм SIGIO может быть вызван рекурсивной отправкой чтения SIGIO. Ваш обработчик сигнала должен просто установить флаг и немедленно вернуться.

...