Sous-routine thread_sigsend
Objectif
Envoie un signal à l'unité d'exécution spécifiée.
Bibliothèque
Bibliothèque C standard (libc.a)
Syntaxe
#include <sys/thread.h>
int thread_sigsend (tid, signal)
tid_t tid;
int signal; Descriptif
La sous-routine Thread_sigsend permet à une unité d'exécution dans un processus d'envoyer un signal à une unité d'exécution spécifique dans le même processus ou dans un autre processus. Si la valeur -1 est transmise dans le champ du paramètre tid, le signal sera transmis au thread appelant.
L'unité d'exécution qui reçoit le signal est identifiée par l'ID d'unité d'exécution du noyau qui a une portée globale. Il peut être obtenu par l'application à l'aide de l'appel système Thread_self . Seul le mode d'unité d'exécution 1: 1 est pris en charge. Le résultat pour le mode d'unité d'exécution M: N n'est pas défini.
L'envoi d'un numéro de signal de 0 entraîne l'exécution de la vérification des erreurs. Aucun signal n'est transmis à l'unité d'exécution cible.
L'effet d'un signal sera le même que dans le cas des appels système kill () ou pthread_kill () , comme expliqué dans la section sigaction disponible sur les serveurs IBM® Power Systems et AIX® Information Center.
Pour envoyer un signal à une unité d'exécution dans un autre processus, l'ID utilisateur réel ou effectif du processus d'envoi doit correspondre à l'ID utilisateur réel ou effectif du processus de réception. Par ailleurs, si le processus d'envoi dispose des droits utilisateur root ou du privilège ACT_P_SIGPRIV , le processus d'envoi peut envoyer un signal à n'importe quelle unité d'exécution. En cas de privilèges insuffisants, un EPERM est renvoyé dans la variable globale Errno .
Paramètres
- ID d'unité d'exécution
- Identificateur de l'unité d'exécution qui recevra le signal. Si la valeur est -1, le signal est transmis au thread appelant.
- SIGNAL
- L'effet d'un signal sera le même que dans le cas des appels système kill () ou pthread_kill (), comme expliqué dans la section Sigaction disponible à l'adresse Serveurs IBM Power Systems et AIX Information Center.
Valeurs renvoyées
- 0
- La commande Thread_sigsend a abouti.
- -1
- L' Thread_sigsend a échoué. La variable globale Errno est définie pour indiquer l'erreur.
Codes d'erreur
- EPERM
- L'unité d'exécution émettant le signal ne dispose pas de droits suffisants pour envoyer le signal à l'unité d'exécution cible.
- ESRCH
- L'unité d'exécution cible est introuvable.
- EINVAL
- Numéro de signal non valide.
Exemple
mykill.c :
#include <sys/thread.h>
#include <sys/signal.h>
int main(int argc, char *argv[])
{
int rc, sig;
tid_t tid;
if (argc < 3) {
printf("Syntax: %s <tid> <signo>\n", argv[0]);
exit(0);
}
tid = atoi(argv[1]);
sig = atoi(argv[2]);
if (thread_sigsend(tid, signo) == -1)
perror("thread_sigsend returned error");
printf("Sent signal %d to thread %d\n",sig,tid);
}
mythread.c :
#include <stdio.h>
#include <signal.h>
#include <pthread.h>
void *thread_func(void *);
void sighand(int signo)
{
printf("-- Received signal %d in thread %d\n",
signo, thread_self());
}
int main(int argc, char *argv[])
{
int rc,i,signo;
pthread_t *ptid;
struct sigaction actions;
int numthreads;
if (argc < 3) {
printf("Syntax: %s <numthreads> <signo>\n", argv[0]);
exit(0);
}
numthreads = atoi(argv[1]);
if (numthreads < 1)
numthreads = 1;
signo = atoi(argv[2]);
ptid = (pthread_t *)calloc(1,
numthreads*sizeof(pthread_t));
pthread_init();
memset(&actions, 0, sizeof(actions));
sigemptyset(&actions.sa_mask);
actions.sa_flags = 0;
actions.sa_handler = sighand;
rc = sigaction(signo,&actions,NULL);
for (i=0; i<numthreads; i++) {
rc = pthread_create(&ptid[i],NULL,thread_func, NULL);
if (rc != 0) {
printf("pthread_create func1 failed. rc =
%d\n",rc);
exit(-1);
}
}
for (i=0; i<numthreads; i++)
pthread_join(ptid[i],NULL);
free(ptid);
}
void *thread_func(void *p)
{
int rc;
tid_t tid = thread_self();
printf("Thread %d started\n", tid);
rc = sleep(20);
if (rc != 0) {
printf("tid %d woken up with rc %d, errno %d\n",
tid, rc, errno);
eturn NULL;
}
printf("tid %d completed sleep\n", tid);
pthread_exit(NULL);
}
Output:
# ./mythread 3 30 &
[1] 192734
Thread 684281 started
Thread 786593 started
Thread 1101959 started
# ./mykill 786593
Sent signal 30 to 786593
-- Received signal 30 in thread 786593
tid 786593 woken up with rc 15, errno 0
# ./mykill 684281
Sent signal 30 to 684281
-- Received signal 30 in thread 684281
tid 684281 woken up with rc 9, errno 0
# tid 1101959 completed sleep