2017-02-15 16 views
2

У меня есть программа, которая использует сигнал (SIGUSR2) для настройки функции обработчика catch для обработки сообщений с высоким приоритетом.C Использование и процесс использования сигналов с помощью очередей сообщений IPC

Программа принимает входящие сообщения из очереди сообщений IPC, используя msgrcv() в своем основном цикле. Когда отправитель сообщений в очередь сообщений IPC хочет уведомить программу о том, что высокий приоритет является входящим, он отправляет SIGUSR2 в процесс, чтобы он прекратил обработку любого текущего сообщения, которое может быть обработано.

В функции обработчика сигнала улова я сначала при входе сделать:

сигнал (SIGUSR2, SIG_IGN);

игнорировать любые новые сигналы для предотвращения.

затем код обрабатывает запрос, где преимущественное хранит в настоящее время обрабатывается сообщение обратно в очередь, ведение домашнего хозяйства и т.д., а затем непосредственно перед возвращением из функции обработчика сигнала делает:

сигнала (SIGUSR2, sighandler_func);

Вопрос: Если еще один сигнал обработки вспышки получен только через наносекунду после , выдается вышеупомянутый сигнал, будет ли процесс повторно отправлен на функцию обработки сигнала ? т.е.: если код в основном цикле, где , сигнал sighold (SIGUSR2) и sigrelse (SIGUSR2) останавливает/запускает прием сигнала преимущественного использования, или это только выше сигнала, который активирует обработчик сигнала?

+0

My [Magic 8 Ball] (https://en.wikipedia.org/wiki/Magic_8-Ball) говорит: «Ответьте, попробуйте снова». Пожалуйста, напишите [минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) - желательно с фактическим кодом. –

+0

Кажется намного проще и бесполезно просто использовать вторую очередь для высокоприоритетных сообщений. –

+0

согласился, но я ограничен клиентом в рамках изменений, которые я могу сделать. – user3053087

ответ

2

Вы должны использовать sigaction для этого:

struct sigaction act; 
memset(&act, 0, sizeof(act); 
act.sa_handler = sighandler_func; 
sigaction(SIGUSR2, &act, NULL); 

Таким образом, обработчик сигнала автоматически вызывается с сигналом заблокированной, который вызвал событие (в вашем случае SIGUSR2). Если теперь во время выполнения обработчика прибывает SIGUSR2, он блокируется до тех пор, пока обработчик сигнала не вернется. Затем (когда сигнал разблокирован), обработчик сигнала вызывается немедленно снова.

Однако, вам придется обработать случай, что многократная SIGUSR2 прибыть в течение одного выполнения обработчика сигнала правильно, так как он будет называться только раз после возвращения обработчика тогда.

+0

Да, в предстоящей версии вызовы обработки сигналов выполняются с использованием POSIX-совместимых вызовов с использованием sigaction. – user3053087