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