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.
Partager