Сократить время между каждой функцией kill () в C - PullRequest
0 голосов
/ 21 февраля 2011

Привет, кто-нибудь знает способ отправить сигнал SIGUSR1 / 2 без потерь на другой pid?

проблема в том, что когда я помещаю kill (pid, SIGUSR1) в цикл while, моя другая программа получает только несколькоиз них, кажется, есть потеря, и я должен ждать между двумя вызовами, чтобы убить ().Я фактически вынужден использовать usleep () в моем цикле, чтобы получить все сигналы SIGUSR, которые я отправил.Я бы хотел получить их все как можно быстрее.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 21 февраля 2011

Вам нужно использовать sigaction() вместо signal(), поскольку sigaction() может контролировать, какие сигналы блокируются во время обработки текущего сигнала. Кроме того, ваш приемник должен обрабатывать каждый полученный сигнал; это относительно дорого по сравнению с отправкой сигнала, так что ваш убийственный (сигнальный) процесс может с легкостью опередить «убитый» (получающий) процесс. Вы должны подумать о том, почему вам нужно отправить так много сигналов. Это механизм для использования в особых обстоятельствах.

1 голос
/ 21 февраля 2011

Нельзя гарантировать гарантированную доставку точно такого же количества сигналов. Если вы отправляете два или более SIGUSR1, в то время как другой процесс заблокирован и не может обработать первый из них, или обрабатывает предыдущий экземпляр этого сигнала, или заблокировал этот сигнал, все сигналы, кроме одного, будут потеряны: в ядре есть битовая маска для ожидающих сигналов, не массив счетчиков.

Вы можете только надеяться получить как можно больше из них.

0 голосов
/ 21 февраля 2011

Есть так называемые сигналы в реальном времени. У них есть очередь, и если вы не переполните очередь, вы гарантированно получите один сигнал на каждый отправленный сигнал. Это сигналы в диапазоне 34-64 или переносимые, SIGRTMIN - SIGRTMAX.

Однако, если ваше задание - использовать SIGUSR1 и SIGUSR2, возможно, вы должны узнать о ненадежной передаче данных. Такие же проблемы возникают в электрических цепях. Если защелка уже установлена ​​электрическим сигналом, то второй сигнал не действует, пока защелка не будет считана и очищена. Вот почему последовательные и параллельные порты имеют тактовые сигналы и / или сигналы подтверждения.

...