очередь сигналов в C - PullRequest
14 голосов
/ 12 марта 2011

У меня есть простая программа под Linux, которая посылает сигнал SIGUSR1 своему дочернему процессу в цикле.Но когда я посылаю, например, 10 сигналов, иногда случается, что ребенок получил только 3 из них.Последний отправленный сигнал всегда SIGUSR2, и он принимается каждый раз.

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

Ответы [ 4 ]

17 голосов
/ 13 марта 2011

Происходит следующее:

  1. Получен первый сигнал, а именно SIGUSR1, обработчик вызван и работает
  2. Получен второй сигнал, поскольку обработчик из nr1 все еще работает,сигнал nr2 становится ожидающим и блокируется.
  3. третий сигнал получен, так как обработчик от nr1 все еще работает, сигнал 3 сбрасывается.
  4. четвертый, пятый ... и т. д сигнал того же типа, что исигнал nr1 отбрасывается.

Как только обработчик сигнала будет выполнен с сигналом nr1, он обработает сигнал nr2, а затем обработчик сигнала обработает SIGUSR2.

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

8 голосов
/ 13 марта 2011

Если несколько сигналов одного типа отправляются и не обрабатываются, они не ставятся в очередь.Скажем, программа маскирует SIGUSR1, звонит kill(getpid(), SIGUSR1) 10 раз и снимает маски SIGUSR1.Он получит SIGUSR1 только один раз.

3 голосов
/ 13 марта 2011

Возможно, ваша проблема в том, что SIGUSR2 - это сигнал, который доставляется сразу, тогда как другие сигналы блокируются или помещаются в очередь (в состоянии ожидания).

Вот как можно проверить наличие ожидающих сигналов: http://www.gnu.org/s/libc/manual/html_node/Checking-for-Pending-Signals.html

1 голос
/ 15 июня 2012

Таким образом, одновременный ввод / вывод многих файлов с помощью SIGIO представляется возможным только в том случае, если для поля struct sigaction sa_flags используется флаг SA_NODEFER и он никогда не блокирует сигналы.

Итак, можно получить прерывание из обработчика сигнала и создать новый поток для каждого отдельного обрабатываемого сигнала. Это становится сложным :) Поэтому неудивительно, почему никто не использует SIGIO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...