TP8 : Utilisation des IPC Unix
1 Partage de zone m´emoire
Commencez par lire cette documentation sur les IPC Unix1et faites tourner l’exemple propos´e. Nous allons
utiliser la m´emoire partag´ee IPC pour inplanter un petit exemple de producteur/consommateur. La zone partag´ee
pourrait ˆetre du type suivant :
struct {
int nb_chars_prod; /* Nb de caract`eres produits */
int nb_chars_conso; /* Nb de caract`eres consomm´es */
char data[MAX]; /* tampon */
int fin; /* signal de fin d’entr´ee */
} ...
Le nombre de caract`eres disponibles dans le tampon est ´egal `a (nb chars prod-nb chars conso). Le consom-
mateur peut consommer si, et seulement si, (nb chars prod > nb chars conso). Le producteur peut produire
ssi ((nb chars prod-nb chars conso) < MAX). Je vous propose de suivre les ´etapes ci-dessous :
1. Le producteur et le consommateur sont des processus diff´erents et des programmes diff´erents. Le produc-
teur lit des caract`eres au clavier et les place dans le tampon. Le consommateur les r´ecup`ere et les affiche.
Ces deux acteurs appliquent la m´ethode de l’attente active pour se synchroniser.
2. Faites en sorte que la zone partag´ee soit cr´ee et initialis´ee par le producteur. Si le consommateur est plus
rapide, il doit attendre que la zone partag´ee soit disponible.
3. Prenez soin de ralentir le producteur et le consommateur pour tester tous les cas de figure.
4. La fin de la lecture au clavier est indiqu´ee au consommateur par la mise `a un du drapeau fin. Ce dernier
a la charge de supprimer la ressource partag´ee avant de se terminer.
2 Les s´emaphores `a messages
Refaites le mˆeme exercice mais en rempla¸cant la m´emoire partag´ee par un envoi de message entre le producteur
et le consommateur. Faites en sorte de ne pas envoyer un caract`ere dans chaque message, mais plutˆot une ligne.
3 Montage de fichiers en m´emoire
La fonction mmap permet de projeter un fichier en m´emoire (plus de pr´ecisions avec man mmap). Voila un petit
exemple :
1ref:dil-doc-IPC
1
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
void creer_fichier(int taille)
{
int i;
FILE *f = fopen("data", "w");
for(i=1; i<taille; i++) fputc(’A’, f);
fputc(’\n’, f);
fclose(f);
}
int main()
{
int file;
char* zone;
int i;
int taille = 60;
/* creation du fichier pour l’exemple */
creer_fichier(taille);
/* ouverture en utilisant les fonctions UNIX */
file = open("data", O_RDWR, 0700);
if (file < 0) {
perror("open");
return (EXIT_FAILURE);
}
/* montage en memoire */
zone = mmap(NULL, taille, PROT_READ, MAP_SHARED, file, 0);
if (zone == NULL) {
perror("mmap");
return (EXIT_FAILURE);
}
/* utilisation */
printf("Affichage du contenu\n");
for(i=0; (i<taille); i++) putchar(zone[i]);
return (EXIT_SUCCESS);
}
1. Ex´ecutez l’exemple et ´etudiez son fonctionnement.
2. Modifiez un des caract`eres en v´erifiant la mise `a jour automatique du fichier sur disque.
3. Alors que votre processus `a d´ej`a projet´e le fichier (freinez le avec un getchar()), modifiez le fichier d’origine
et v´erifiez que la modification est bien report´ee dans la version projet´ee.
2
1 / 2 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !