2012-03-14 2 views
3
  1. Есть (SIGRTMIN + 1) безопасный для межпроцессного общения? Будет ли оно изменяться в разных процессах?Некоторые вопросы о сигналах linux

  2. Есть ли какие-либо отличия в использовании sigqueue(2) или kill(2) для отправки стандартных сигналов и сигналов в реальном времени?
    Если я использую sigqueue(2), отправьте серию SIGUSR1 (стандартные сигналы) и обрабатывайте их медленно, есть ли в очереди очередные экземпляры SIGUSR1?
    Как насчет использования kill(2) для отправки SIGRTMIN (сигналы реального времени)? Будут ли они поставлены в очередь?

ответ

3

sigqueue() может использоваться для отправки только сигналов в реальном времени и kill() может использоваться для отправки только стандартных сигналов. Я не пытался отправить неверный сигнал с помощью API. Но я бы ожидал, что он потерпит неудачу с некоторой соответствующей ошибкой. Linux не ставит в очередь стандартные сигналы. Сигналы в реальном времени помещаются в очередь. Максимальное количество реальных сигналов времени, которые могут быть поставлены в очередь, определяются как RLIMIT_SIGPENDING

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

EDIT

я был неправ раньше в моем ответе. Похоже, kill() может отправлять сигналы в реальном времени. Но из комментария в __send_signal() похоже, что использование kill для отправки сигналов в реальном времени может не иметь желаемого эффекта в некоторых случаях, то есть: сигналы могут не попадать в очередь.

/* 
    * Real-time signals must be queued if sent by sigqueue, or 
    * some other real-time mechanism. It is implementation 
    * defined whether kill() does so. We attempt to do so, on 
    * the principle of least surprise, but since kill is not 
    * allowed to fail with EAGAIN when low on memory we just 
    * make sure at least one signal gets delivered and don't 
    * pass on the info struct. 
    */ 
+0

По опыту, прочитав исходный код ядра или прочитав спецификации Posix? Если у вас есть некоторые источники, было бы интересно поделиться ими ... –

+1

Но факт как 'kill (2)', так и 'sigqueue (2)' может отправлять любые сигналы без сбоев. Я написал небольшой тест, чтобы доказать, что они работают. Но я не знаю, как отправить исходный код в комментарий. – majie

0

Это сообщение не новость, но высокий рейтинг на Google и, к сожалению, вводит в заблуждение, так вот некоторые пояснения:

  1. можно послать любой сигнал с любой из этих функций
  2. sigqueue позволяет передачи более «контекста» [например, информация, @see siginfo et. al], в отличие от kill/raise
  3. В соответствии с сигналами реального времени - неважно, отправлены или поставлены в очередь - они будут вести себя одинаково [например, в очереди ср. сгруппированы так же, как с сигналами без RT]
Смежные вопросы