Bonjour, avant de commencer, je tiens à remercier ceux qui prendront la peine de lire mon message !

Mon problème est le suivant, je dois faire communiquer un processus père avec ses fils, ces derniers doivent générer deux tableaux et multiplier chaque case entre elles => tab1[i] * tab2[i] pour chaque i.
le père doit récupérer la somme totale de chaque calcul et l'afficher ( le tout via un tube )

Mon problème est que je n'arrive pas à récupérer toutes les valeurs calculées par les fils dans le descripteur de lecture via le père...
Ps : J'ai longuement cherché sur mais sans succès (J'ai sûrement mal cherché ><)

Voici le programme :

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
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
69
 
#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include<unistd.h>
#include <time.h> 
 
int lerandom(int a, int b){
	return rand() / (double)(RAND_MAX + 1) * (b-a) + a;
}
 
int *generer_tableau(int n){
	int *tableau=NULL;
	int i = 0;
	tableau = malloc(n*sizeof(int));
	while(i < n){
		tableau[i]=lerandom(0,10);
		//printf("case n° %d = %d \n",i,tableau[i]);
		i++;
		}
	return tableau;
}
 
int main(int argc, char* argv[]){
	int tube[2];
	srand(time(NULL) ^ getpid());
	// Gérer l'erreur
	if (pipe(tube)==-1){
		printf("pipe failed\n");
		return 1;
	}
	int n=atoi(argv[1]);
	pid_t pid;
	int i=0,c,somme=0;
	int *v1 = generer_tableau(n); //premier vecteur
	int *v2 = generer_tableau(n); //second vecteur
	for(i=0;i<n;i++){
		if ((pid=fork())==0){ // Fils
			printf("Dans le fils, on ferme la lecture\n");
			// Fermeture de lecture
			close(tube[0]);
			c = v1[i]*v2[i];
			printf("Le fils n°%d a calcule : %d x %d = %d\n",i,v1[i],v2[i],c);
			write(tube[1],&c,sizeof(int));
			// Fermeture de l'écriture
			close(tube[1]);
			exit(0);
			}
		else if (pid==-1){ // erreur
			error("erreur de creation de tube\n");
			exit(-1);
		}
		else {
			// Père
			// On ferme l'écriture
			// On attend que le processus fils s'exécute 
			wait(NULL);
			close(tube[1]);
			read(tube[0],&c,sizeof(int));
			somme=c+somme;	
			printf("Le père calcule la somme et obtient pour le moment : %d\n",somme);
			close(tube[0]);
			// On n'oubli pas de fermer la lecture après avoir lu
 
		}
	}
	printf("le père a calculé la somme finale : %d \n",somme);
	return 0;
}
voici ce que ça donne à l'exécution :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
./a.out 2
Dans le fils, on ferme la lecture
Le fils n°0 a calcule : -1 x -4 = 4
Le père calcule la somme et obtient pour le moment : 4
Dans le fils, on ferme la lecture
Le fils n°1 a calcule : -9 x -3 = 27
Le père calcule la somme et obtient pour le moment : 8
le père a calculé la somme finale : 8

Cordialement ,
boblinux