Обработка сигналов в UNIX - PullRequest
0 голосов
/ 20 апреля 2011

После регистрации обработать сигнал.В функции обработчика сигналов необходимо повторно вызывать signal () для перерегистрации?

1 Ответ

2 голосов
/ 20 апреля 2011

Проверьте этот ответ. Или, в частности, эта ссылка. По сути, это зависит от модели (BSD или System V), используемой вашей системой Unix.

Извлечение из справочной страницы сигнала.

В оригинальных системах Unix, когда обработчик, который был установлен с использованием signal (), был вызван доставкой сигнала, расположение сигнала будет сброшено в SIG_DFL, и система не блокировала доставку дальнейших экземпляров сигнала. Система V также предоставляет эту семантику для signal (). Это было плохо, потому что сигнал может быть доставлен снова до того, как обработчик сможет восстановить себя. Кроме того, быстрая доставка одного и того же сигнала может привести к рекурсивной вызовы обработчика.

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

Ситуация в Linux выглядит следующим образом:

  • Системный вызов signal () ядра обеспечивает семантику System V.
  • По умолчанию в glibc 2 и новее функция-обертка signal () не вызывает системный вызов ядра. Вместо этого он вызывает sigaction (2), используя флаги, которые предоставляют семантику BSD. Это поведение по умолчанию предоставляется до тех пор, пока определен макрос функционального теста _BSD_SOURCE. По умолчанию _BSD_SOURCE определен; это также неявно определяется, если кто-то определяет _GNU_SOURCE, и, конечно, может быть явно определено.
    В glibc 2 и более поздних версиях, если макрос тестирования функции _BSD_SOURCE не определен, signal () предоставляет семантику System V. (Неявное определение по умолчанию _BSD_SOURCE не предоставляется, если кто-либо вызывает gcc (1) в одном из его стандартных режимов (-std = xxx или -ansi) или определяет различные другие макросы тестирования функций, такие как _POSIX_SOURCE, _XOPEN_SOURCE или _SVID_SOURCE; см. Feature_test_macros; (7).)
  • Функция signal () в Linux libc4 и libc5 обеспечивает семантику System V. Если один в системе libc5 включает вместо, то signal () обеспечивает семантику BSD.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...