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 70 71 72 73
| #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;
}
void affiche(int *v, int n)
{
int i;
fputs("tableau généré: ", stdout);
for (i=0; i < n; i++)
printf("%d, ", v[i]);
fputc('\n', stdout);
}
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
affiche(v1, n);
affiche(v2, n);
for(i=0;i<n;i++){
if ((pid=fork())==0){ // Fils
// Fermeture de lecture
close(tube[0]);
c = v1[i]*v2[i];
printf("Le fils n°%d (%d) a calcule : %d x %d = %d\n", i, getpid(), v1[i], v2[i], c);
write(tube[1],&c,sizeof(int));
// Fermeture de l'écriture
close(tube[1]);
exit(0);
}
else {
// Père
// On attend que le processus fils s'exécute
wait(NULL);
read(tube[0],&c,sizeof(int));
somme=c+somme;
printf("Le père de %d récupère %d et calcule la somme : %d\n", pid, c, somme);
}
}
close(tube[1]);
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;
} |
Partager