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.







Répondre avec citation
Partager