2011-04-20 5 views
0

Après l'enregistrement pour gérer un signal. Dans la fonction de gestionnaire de signal, est-il nécessaire d'appeler de nouveau le signal() pour se réenregistrer?Traitement du signal sous UNIX

+0

Et la question est? : | – Albireo

+2

est-il nécessaire d'appeler à nouveau signal() pour ré-enregistrer? – shreyasva

Répondre

2

Vérifiez this réponse. Ou particulièrement this lien. Fondamentalement, cela dépend du modèle (BSD ou System V) de votre système Unix.

Extrait de la page man de signal.

Dans les systèmes Unix d'origine, lorsqu'un gestionnaire qui a été créé signal à l'aide() a été invoqué par la délivrance d'un signal, la disposition du signal serait remis à zéro à SIG_DFL, et le système n'a pas bloqué la livraison d'autres instances du signal. Le système V fournit également ces sémantiques pour signal(). Cela était mauvais car le signal pouvait être remis à nouveau avant que le gestionnaire ait une chance de se rétablir. De plus, des livraisons rapides du même signal pourraient entraîner des invocations récursives du manipulateur.

BSD amélioré cette situation en changeant la sémantique de gestion du signal (mais, malheureusement, a changé silencieusement la sémantique lors de l'établissement d'un gestionnaire avec un signal()). Sur BSD, lorsqu'un gestionnaire de signal est appelé, la disposition du signal n'est pas réinitialisée, et d'autres instances du signal sont bloquées pendant l'exécution du gestionnaire .

La situation sur Linux est la suivante:

  • L'appel système signal() du noyau fournit une sémantique système V.
  • Par défaut, dans glibc 2 et plus tard, la fonction enveloppe signal() n'invoque pas l'appel système du noyau. Au lieu de cela, il appelle sigaction (2) en utilisant des drapeaux qui fournissent la sémantique BSD. Ce comportement par défaut est fourni tant que la macro de test de fonctionnalité _BSD_SOURCE est définie. Par défaut, _BSD_SOURCE est défini; il est également implicitement défini si l'on définit _GNU_SOURCE, et peut bien sûr être explicitement défini.
    Sur la glibc 2 et les versions ultérieures, si la macro de test de fonctionnalité _BSD_SOURCE n'est pas définie, signal() fournit la sémantique du système V. (La valeur par défaut définition implicite de _BSD_SOURCE est pas fourni, si on invoque gcc (1) dans un de ses modes standard (std = xxx ou -ansi) ou définit diverses autres macros de test de fonctionnalité tels que _POSIX_SOURCE, _XOPEN_SOURCE ou _SVID_SOURCE; voir feature_test_macros (7).)
  • La fonction signal() sous Linux libc4 et libc5 fournir une sémantique System V. Si un système libc5 inclut à la place de, signal() fournit une sémantique BSD.
Questions connexes