Bonjour. Alors voilà je dois écrire un programme qui prend en entrée un entier qu'un anneau de N processus doit se passer. A chaque passage dans un processus cet entier doit se décrémenter et lorsqu'il atteint 0 on renvoie le numéro de processus correspondant (compris entre 0 et N, pas le pid). J'ai écrit le code suivant :

Code C : 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
 
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
#include "/usr/include/linux/limits.h"
 
 
void decremente (int a,int n)
{
    int pid,reason;
    int tubes[n][2];
    int resultat;
 
    int new_value;
 
    int cpt=0;
 
    int lec,ecr;
 
    for (int j=0;j<n;j++){
        if(pipe(tubes[j]) == -1)
            perror("pipe");
    }
    for(int i=0;i<n;i++){
        switch(pid=fork()){
        case -1:
            perror("fork");
            break;
 
        case 0:
            lec=tubes[i][0];
            ecr=tubes[(i+1)%n][1];
 
            if(read(lec,&new_value,PIPE_BUF) == -1)
                perror("read");
            close(lec);
            new_value--;
 
            if(new_value == 0){
                resultat=i;
 
            } else {
                if(write(ecr,&new_value,PIPE_BUF) == -1)
                    perror("write");
            }
            close (ecr);
            break;
 
        default:
            while(cpt < n){
                if(wait(&reason)==-1)
                    perror("wait");
            }
            break;
        }
    }
    fprintf(stdout, "RESULTAT : %d\n",resultat);
}
 
int main (int argc, char**argv)
{
    if(argc != 3)
       perror("Usage : ./exec <a> <n>");
 
    decremente(atoi(argv[1]),atoi(argv[2]));
return 0;
}

Il semble qu'il y'ait un bloquage au niveau de mon read mais je ne comprends pas pourquoi. Du coup le résutat retourné vaut toujours 0.
Merci pour votre aide.