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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
| /*
* Calcul d'une somme de matrice dans un espace
* mémoire partagé par deux processus.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/wait.h>
/*****************************
* (DÉBUT) MATRICE
*****************************/
#define TAILLE 4
/* Structure représentant une matrice carrée */
typedef struct mat Mat;
struct mat {
int taille;
int t[TAILLE][TAILLE];
};
void remplirMat(Mat* m) {
int i,j,cpt=0;
m->taille = TAILLE;
for (i=0; i<m->taille; i++)
for (j=0; j<m->taille; j++) {
m->t[i][j] = cpt;
cpt++;
}
}
void affichMat(Mat* m) {
int i,j;
for (i=0; i<m->taille; i++) {
for (j=0; j<m->taille; j++)
printf("%d\t", m->t[i][j]);
printf("\n");
}
}
/****************************
* (FIN) MATRICE
****************************/
/* Structure de la mémoire partagée */
typedef struct mem Mem;
struct mem {
Mat matSom; /* Matrice résultant de la somme */
};
int main(int argc, char** argv) {
int i,j;
pid_t pidFils; /* PID du processus fils */
int dsc; /* Descripteur du fichier */
Mem *obj; /* Zone mémoire partagée entre les proc. */
Mat mat1, mat2; /* Deux matrices */
errno = 0;
/* ouvre un fichier (qui sera projeté en mémoire) */
dsc = open("/home/guillaume/bidon", O_RDWR);
if (dsc == -1) {
perror("main l.27");
return -1;
}
else {
errno = 0;
/* réajuste la taille du fichier à celle nécessaire */
if (ftruncate(dsc, sizeof(Mem)) == -1) {
perror("main l.38");
return -1;
}
else {
errno = 0;
/* projete le fichier en mémoire */
obj = (Mem*) mmap(0, sizeof(Mem), PROT_WRITE, MAP_SHARED,
dsc, 0);
if (obj == (void*) -1) {
perror("main l.43");
return -1;
}
else {
remplirMat(&mat1); /* initialisation et affichage des */
remplirMat(&mat2); /* matrices */
affichMat(&mat1); printf("\n");
affichMat(&mat2);
remplirMat(&(obj->matSom)); /* écrase les anciennes données */
pidFils = fork(); /* Lance le processus fils */
if (pidFils == -1)
return -1;
else if (pidFils == 0) { /* Processus fils */
for (i=0; i<obj->matSom.taille; i++) // Ttes les lignes
for (j=1; j<obj->matSom.taille; j+=2) // Ttles les colonnes impaires
obj->matSom.t[i][j] = (mat1.t[i][j] + mat2.t[i][j]); // Somme des 2 matrices
exit(0); // Processus terminé
}
else { /* Processus père */
for (i=0; i<obj->matSom.taille; i++) // Ttes les lignes
for (j=0; j<obj->matSom.taille; j+=2) // Ttles les colonnes paires
obj->matSom.t[i][j] = (mat1.t[i][j] + mat2.t[i][j]); // Somme des 2 matrices
wait(NULL); // Attend que le proc. fils est terminé
}
printf("Somme des matrices : \n");
affichMat(&(obj->matSom));
if (munmap(obj, sizeof(Mem)) != 0) return -1; /* supprime la projection en mémoire */
if (close(dsc) != 0) return -1; /* ferme le fichier */
}
}
}
return 0;
} |
Partager