Loading

NOM

       signal - Gestion de signaux ANSI C.

SYNOPSIS

       #include <signal.h>

       typedef void (*sighandler_t)(int);

       sighandler_t signal(int signum, sighandler_t handler);

       Le comportement de signal() varie selon les versions d’Unix, et a aussi
       varié au cours du temps dans les différentes versions de Linux.  Évitez
       de   lutiliser :   utilisez   plutôt  sigaction(2).  Voir  la  section
       Portabilit plus bas.

       signal() installe  le  gestionnaire  handler  pour  le  signal  signum.
       handler  peut être SIG_IGN, SIG_DFL ou l’adresse d’une fonction définie
       par le programmeur (un « gestionnaire de signal »).

       Lors de l’arrivée d’un signal correspondant au numéro signum, l’un  des
       événements suivants se produit :

       *  Si le gestionnaire vaut SIG_IGN, le signal est ignoré.

       *  Si  le  gestionnaire  est SIG_DFL, l’action par défaut associée à ce
          signal est entreprise (voir signal(7)).

       *  Si  le  gestionnaire  est  une  fonction,  alors  tout  d’abord   le
          gestionnaire  est  reconfiguré  à   SIG_DFL, ou le signal est bloqué
          (voir la section Portabilit ci‐dessous), puis handler  est  appelée
          avec  l’argument signum. Si l’invocation du gestionnaire a bloqué le
          signal, le signal est débloqué au retour du gestionnaire.

       Les  signaux  SIGKILL  et  SIGSTOP  ne  peuvent  être  ni  ignorés,  ni
       interceptés.

VALEUR RENVOYÉE

       signal()  renvoie  la  valeur précédente du gestionnaire de signaux, ou
       SIG_ERR en cas d’erreur.

ERREURS

       EINVAL signum est invalide.

CONFORMITÉ

       C89, C99, POSIX.1-2001.

NOTES

       Les  effets  de  signal()  dans   un   processus   multi-threadé   sont
       indéterminés.

       Comme  spécifié  par POSIX, le comportement d’un processus est indéfini
       après la réception d’un signal SIGFPE, SIGILL, ou SIGSEGV qui  n’a  pas
       été  engendré par une fonction kill(2) ou raise(3). La division entière
       par zéro a un  résultat  indéfini,  sur  certaines  architectures  elle
       déclenche  un  signal SIGFPE. De même, diviser l’entier le plus négatif
       par -1 peut déclencher SIGFPE.

       Voir sigaction(2) pour des détails sur ce qui se passe quand  on  place
       SIGCHLD à SIG_IGN.

       Voir  signal(7)  pour  une  liste  de  fonctions sûres pour les signaux
       asynchrones  qui  peuvent  être  appelées  dans  les  gestionnaires  de
       signaux.

       L’utilisation  du  type  sighandler_t  est  une extension GNU. Diverses
       versions de la bibliothèque C prédéfinissent  ce  type.  Les  libc4  et
       libc5  définissaient  SignalHandler.  La  glibc  définit  sig_t  et, si
       _GNU_SOURCE est défini, sighandler_t également. Sans cette  définition,
       la déclaration de signal() est plus difficile à lire :

           void ( *signal(int signum, void (*handler)(int)) ) (int);

   Portabilité
       La  seule  utilisation  portable  de  signal()  est de de configurer le
       gestionnaire du signal à SIG_DFL ou SIG_IGN. La sémantique  associée  à
       l’utilisation de signal() pour définir un gestionnaire de signal dépend
       suivant les systèmes (et POSIX.1 autorise explicitement  ces  écarts) ;
       ne lutiliser pas pour cela.

       POSIX.1   a   résolu   ce   problème   de  portabilité  est  spécifiant
       sigaction(2), qui fournit un contrôle explicite de la sémantique  quand
       un  gestionnaire de signal est appelé ; utilisez cette interface plutôt
       que signal().

       Dans les systèmes Unix d’origine,  quand  un  gestionnaire  défini  par
       signal()   était  appelé  lors  de  la  distribution  d’un  signal,  le
       gestionnaire du signal était remis à SIG_DFL, et le système ne bloquait
       pas la distribution des instances suivantes du signal. System V fournit
       également cette sémantique pour  signal().  Ça  posait  problème  parce
       qu’un  signal  pouvait  être distribué avant que le gestionnaire ait le
       temps de se ré-activer. De  plus,  la  distribution  rapide  d’un  même
       signal pouvait causer des appels récursif au gestionnaire.

       BSD  a amélioré la situation en changeant la sémantique du gestionnaire
       de signal (mais,malheureusement, changeât silencieusement la sémantique
       pour  la définition d’un gestionnaire avec signal()). Sur BSD, quand un
       gestionnaire de signal est appelé, le gestionnaire n’est  pas  remis  à
       zéro,  et la distribution des instances suivantes du signal est bloquée
       tant que le gestionnaire s’exécute.

       La situation sous Linux est la suivante :

       * L’appel système signal() du noyau fournit la sémantique System V.

       * Par défaut,  dans  la  glibc 2  et  les  suivantes,  la  fonction  de
         bibliothèque signal() n’appelle pas l’appel système. À la place, elle
         appelle sigaction(2) est  fournissant  un  attribut  qui  fournit  la
         sémantique  BSD.  Ce  comportement  par défaut est fourni tant que la
         macro de test de fonctionnalités _BSD_SOURCE est définie. Par défaut,
         _BSD_SOURCE est définie ; elle est également implicitement définie si
         on défini _GNU_SOURCE, et peut également être définie  explicitement.

         Dans   la   glibc 2  et  les  suivantes,  si  la  macro  de  test  de
         fonctionnalités _BSD_SOURCE n’est pas définie, alors signal()  fourni
         la  sémantique  System V. (la définition implicite de _BSD_SOURCE par
         défaut n’est pas fournie si on appelle gcc(1) dans un  de  ses  modes
         demandant le respect d’une norme (-std=xxx ou -ansi) ou si on définie
         certaines   autres   macro   de   test   de   fonctionnalités   comme
         _POSIX_SOURCE,      _XOPEN_SOURCE      ou     _SVID_SOURCE ;     voir
         feature_test_macros(7).)

       * La fonction signal() de la libc4 et de la libc5 Linux fournissent  la
         sémantique  System V.  Si  on  inclue <bsd/signal.h> sur une libc5 au
         lieu de <signal.h>, alors signal() fournie la sémantique BSD.

VOIR AUSSI

       kill(1),  alarm(2),   kill(2),   killpg(2),   pause(2),   sigaction(2),
       signalfd(2), sigpending(2), sigprocmask(2), sigqueue(2), sigsuspend(2),
       bsd_signal(3),  raise(3),  siginterrupt(3),  sigsetops(3),   sigvec(3),
       sysv_signal(3), feature_test_macros(7), signal(7)

COLOPHON

       Cette  page  fait  partie  de  la  publication 3.23 du projet man-pages
       Linux. Une description du projet et des instructions pour signaler  des
       anomalies       peuvent       être       trouvées      à      l’adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Cette page de manuel a été traduite  et  mise  à  jour  par  Christophe
       Blaess  <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
       Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et  mise  à
       disposition sur http://manpagesfr.free.fr/.

       Les mises à jour et corrections de la version présente dans Debian sont
       directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
       francophone de traduction de Debian.

       Veuillez   signaler   toute   erreur   de   traduction  en  écrivant  à
       <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
       paquet manpages-fr.

       Vous  pouvez  toujours avoir accès à la version anglaise de ce document
       en utilisant la commande « man -L C <section> <page_de_man> ».