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)