Linux

CentOS 4.8

pthread_kill(3thr)


PTHREAD_SIGNAL

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);

DESCRIPTION

pthread_sigmask change le masque des signaux pour le thread appelant tel que décrit par les arguments 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 arguments 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 signaus indiqués par newmask sont ajoutés au masque de signaux courant [Ndt: mask|=newmask]. Si how vaut SIG_UNBLOCK, les signaux indiqués par newmask sont retirés du masque courrant [Ndt : mask&= !newmask].

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’in des signaux reçus possède un gestionnaire de signal, cette fonction n’est pas appellée.

ANNULLATION

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 suivant 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 renvoi l’un des codes d’erreur suivant 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>

TRADUCTION

Thierry Vignaud <tvignaud@mandrakesoft.com>, 2000

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 celà est de bloquer ces signals avant de créer les threads puis de ne jamais débloquer ces signaux dans aucun de ces threads sauf en appellant 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 deux 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 pour la durée de l’attente. Comme les gestionnaires de signaux sont partagés par tous les threads, les autres threads ne doivent pas attacher leur propres gestionnaires de thread sur ces signaux, ni bloquer ces signaux (ce qui est pourtant recommandé ! -- voir la rubrique NOTES).


pthread_kill(3thr)