Loading

NOM

       pthread_sigmask,  pthread_kill,  sigwait - Gestion des signaux dans les
       threads

SYNOPSIS

       #include <pthread.h>
       #include <signal.h>

       int  pthread_sigmask(int  how,  const   sigset_t   *newmask,   sigset_t
       *oldmask);

       int pthread_kill(pthread_t thread, int signo);

       int sigwait(const sigset_t *set, int *sig);

       pthread_sigmask()  change le masque des signaux pour le thread appelant
       tel que décrit par les paramètres how et newmask. Si  oldmask  ne  vaut
       pas   NULL,   le  précédent  masque  de  signaux  est  sauvegardé  dans
       l’emplacement pointé par oldmask.

       La signification des paramètres how et newmask est  la  même  que  pour
       sigprocmask(2).  Si  how  vaut  SIG_SETMASK,  le  masque  de signal est
       positionné à newmask. Si how vaut SIG_BLOCK, les signaux  indiqués  par
       newmask  sont  ajoutés  au  masque  de  signaux  courant.  Si  how vaut
       SIG_UNBLOCK, les signaux indiqués par newmask sont  retirés  du  masque
       courant.

       N.B. :  Les masques de signaux sont définis par thread, mais la gestion
       des signaux et les gestionnaires associés, tels que mis  en  place  par
       sigaction(2), sont partagés par tous les threads.

       pthread_kill  envoie le signal numéro signo au thread thread. Le signal
       est reçu et géré tel que décrit dans kill(2).

       sigwait() suspend le thread appelant jusqu’à ce que  l’un  des  signaux
       définis  dans  set  soit envoyé au thread appelant. Le numéro du signal
       reçu est alors sauvegardé dans  l’emplacement  pointé  par  sig  et  la
       fonction  rend  la  main.  Les  signaux  définis  dans set doivent être
       bloqués et non ignorés lorsque l’on entre dans sigwait(). Si  l’un  des
       signaux  reçus  possède un gestionnaire de signal, cette fonction nest
       pas appelée.

ANNULATION

       sigwait() est un point d’annulation.

VALEUR RENVOYÉE

       En cas de succès, 0 est renvoyé. En cas d’échec, un code  d’erreur  non
       nul est renvoyé.

ERREURS

       La  fonction pthread_sigmask() renvoie l’un des codes d’erreur suivants
       en cas de problème :

              EINVAL how n’est ni SIG_SETMASK, ni SIG_BLOCK, ni SIG_UNBLOCK.

              EFAULT newmask ou oldmask pointe en dehors de  l’espace  mémoire
                     du processus.

       La fonction pthread_kill () renvoie l’un des codes d’erreur suivants en
       cas de problème :

              EINVAL signo n’est pas un masque de signaux valide.

              ESRCH  Le thread thread n’existe pas (par exemple, il s’est déjà
                     achevé).

       La fonction sigwait() ne renvoie jamais de code d’erreur.

AUTEUR

       Xavier Leroy <Xavier.Leroy@inria.fr>

VOIR AUSSI

       sigprocmask(2), kill(2), sigaction(2), sigsuspend(2).

NOTES

       Afin  que  sigwait() fonctionne de manière fiable, les signaux que l’on
       attend doivent être bloqués dans tous les  threads,  pas  seulement  le
       thread   appelant,   sinon  les  sémantiques  de  POSIX  concernant  le
       traitement du  signal  ne  garantissent  pas  que  le  thread  appelant
       sigwait()  sera celui recevant le signal. La meilleur manière d’assurer
       cela est de bloquer ces signaux avant de créer les threads puis  de  ne
       jamais débloquer ces signaux dans aucun de ces threads sauf en appelant
       sigwait().

BOGUES

       La gestion des signaux dans LinuxThreads ne respecte pas celle  définie
       par  le  standard  POSIX.  Selon  le standard, un signal « asynchrone »
       (externe) doit être dérouté vers le processus tout entier (c’est-à-dire
       vers tous les threads le composant) mais seul l’un d’eux doit le gérer.
       Celui-ci peut être n’importe lequel des  threads  ne  bloquant  pas  le
       signal.

       Dans LinuxThreads, chaque thread est un processus par rapport au noyau,
       possédant son propre PID, aussi les signaux  extérieurs  sont  toujours
       envoyés  vers  un  thread particulier. Si, par exemple, un autre thread
       est bloqué dans sigwait() sur ce signal, il ne sera pas relancé.

       L’implémentation de sigwait() par LinuxThreads installe un gestionnaire
       de  signaux  vide  pour  les signaux définis dans set durant l’attente.
       Comme les gestionnaires de signaux sont partagés par tous les  threads,
       les  autres threads ne doivent pas attacher leurs propres gestionnaires
       sur ces signaux, mais doivent bloquer ces signaux (ce qui est de  toute
       façon recommandé -- voir la rubrique NOTES).

TRADUCTION

       Cette  page  de  manuel a été traduite par Thierry Vignaud <tvignaud AT
       mandriva DOT com> en 2000 et  révisée  par  Alain  Portal  <aportal  AT
       univ-montp2  DOT  fr>  en  2006.   La  version présente dans Debian est
       maintenue par les membres de la liste <debian-l10n-french AT lists  DOT
       debian  DOT  org>.  Veuillez signaler toute erreur de traduction par un
       rapport de bogue sur le paquet manpages-fr-extra.

                                 LinuxThreads                PTHREAD_SIGNAL(3)