Bonjour,

Je bloque sur la création d'une fonction. L'objectif est de créer une fonction qui va lire des nombres sur le descripteur tube et les comparer à val. Ces nombres sont envoyés par des processus fils. Si le nombre lu est supérieur (respectivement inférieur) à val alors le signal SIGUSR1 (respectivement SIGUSR2) est envoyé au processus fils qui a écrit cette valeur. Sinon (les deux valeurs sont égales), c’est le signal SIGTERM qui est envoyé au processus fils correspondant et les valeurs suivantes lues sur tube provoqueront systématiquement l’envoi du signal SIGTERM aux processus à l’origine de ces valeurs. La fonction retourne le pid du vainqueur lorsqu’il n’y a plus rien à lire sur tube.

J'ai commencé à écrire mais je bloque sur la façon d'envoyer les signaux au bon processus fils (grâce à son pid). De plus, j'ai un doute sur la lecture dans le tube.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
pid_t lecture(int val, int tube)
{
    int valeur_lue;
    int pid_gagnant;
 
    // Bloque les signaux SIGUSR1, SIGUSR2 et SIGTERM pendant la lecture dans le tube
    sigset_t masque;
    sigemptyset(&masque);
    sigaddset(&masque, SIGUSR1);
    sigaddset(&masque, SIGUSR2);
    sigaddset(&masque, SIGTERM);
    sigprocmask(SIG_BLOCK, &masque, NULL); 
 
    // Pb : lire les valeurs dans le tube et connaître le pid du fils qui écrit 
    // chaque valeur
    while (read(tube, &valeur_lue, sizeof(int) > 1))
    {
        // On compare 
        if (valeur_lue > val)
        {
            // Ici, comment trouver le bon pid ?
            kill (pid_du_fils_qui_a_ecrit, SIGUSR1);
        } else if (valeur_lue < val)
        {
            kill (pid_du_fils_qui_a_ecrit, SIGUSR2);
        } else 
        {
            kill (pid_du_fils_qui_a_ecrit, SIGTERM);
        }
    }
 
    sigprocmask(SIG_UNBLOCK, &masque, NULL); // Débloque les signaux SIGUSR1, SIGUSR2 et SIGTERM
 
 
    return pid_gagnant;
}
Merci d'avance