• Aucun résultat trouvé

TP 5 Système d’exploitation 2:

N/A
N/A
Protected

Academic year: 2022

Partager "TP 5 Système d’exploitation 2:"

Copied!
8
0
0

Texte intégral

(1)

Année universitaire:

2019-2020

TP 5 Système d’exploitation 2:

communication interprocessus

SMI - S4

Cours donné par:

Pr. N. ALIOUA

1

(2)

A. Les pipes

int pipe(int descripteur[2]);

Elle prend en paramètre un tableau de int de taille 2 dans lequel elle retourne les descripteurs à utiliser pour accéder au pipe:

descripteur[0]: désigne le descripteur pour la lecture (la sortie du pipe) ; descripteur[1]: désigne le descripteur pour l’écriture (l'entrée du pipe).

Elle renvoie une valeur de type int, 0 si elle réussit, ou une autre valeur dans le cas contraire.

int write(int entreeTube, void * buf, int nombreCaractAEcrire);

La fonction prend en paramètre:

l'entrée du tube (descripteur[1]),

un pointeur vers la mémoire où seront rangés les caractères à écrire, le nombre de caractères à écrire.

Elle renvoie une valeur de type int correspondant au nombre de caractères

effectivement écrits.

(3)

A. Les pipes

int read(int sortieTube, void * buf, int nombreCaractALire);

La fonction prend en paramètre:

la sortie du tube (descripteur[0]),

un pointeur vers la mémoire où seront rangés les caractères lus, le nombre de caractères à lire.

Elle renvoie une valeur de type int qui correspond au nombre de caractères effectivement lus.

int close(int descripteur);

La valeur prise en paramètre correspond au descripteur, de l'entrée ou de la sortie, à fermer.

Une précaution voudrait qu'un processus ferme systématiquement les

descripteurs dont il n'a pas besoin pour éviter les interblocages.

(4)

A. Pipe ordinaire

A l’exécution, ce programme affiche:

• La fonction pipe(p) permet la création du pipe ordinaire par le père

• Lorsqu’on est dans le fils1 (pidfils1==0) qui joue le rôle de producteur, on ferme le descripteur de la lecture avec close(p[0]) car on va faire une écriture.

• Ensuite, on effectue l’écriture avec write(p[1],"ABCDE",5): p[1] est le descripteur de l’écriture, la chaine de caractère "ABCDE" est le message qui sera écrit dans le pipe et il faut à la fin préciser sa taille qui est 5 ici

• Lorsqu’on est dans le fils2 (pidfils2==0) qui joue le rôle de consommateur, on ferme le descripteur de l’écriture avec close(p[1]) car ce processus va uniquement lire à partir du pipe

• Ensuite, on effectue la lecture avec read(p[0],buf,5): p[0] est le descripteur de lecture, la chaine de caractère lue sera placée dans buf, il faut à la fin préciser sa taille qui est 5 ici

(5)

B.Pipe nommé

• Au moment de l’exécution du programme ecrivainPipe et lecteurPipe, il faut inclure le nom du pipe nommé qui va être crée et qu’on appelle par exemple MonPipe.

L’exécution doit se faire alors avec la commande:

• ./ex MonPipe

• Le nom du pipe qu’on a donné sera placé dans nomTube[1]. Dans cet exemple, sa valeur est MonPipe.

• 2videment, le nom utilisé doit être le même pour le processus ecrivain et lecteur, car c’est lui qui va contenir les messages échangés entre les 2.

• Programme ecrivain:

• La fonction mkfifo retourne 0 en cas de succès (tube créé) ou -1 en cas d'échec

• nomTube[1] est le nom du pipe qu’on passé en paramètre

• 0644 correspond au droit d’accès au pipe nommé:

• 0: ne change jamais (conservé pour de futurs extensions des droits d’accès)

• Propriétaire: read & write (6)

• groupe: read (4)

• autres: read (4)

(6)

B. Pipe nommé

• Programme ecrivain (suite):

• Open prend en paramètre le nom du pipe (le pipe nommé est un fichier) et spécifie que le pipe sera utilisé en écriture seule grâce à l’option O_WRONLY. La fonction retourne -1 en cas d’erreur d’ouverture du pipe ou un entier (considéré comme un descripteur du fichier ouvert) qui sera utilisé par les fonction read ou write.

• Write prend en paramètre le descripteur du pipe ouvert, le message à écrire et sa taille

• Le rôle du processus écrivain est terminé puisqu’il a réussi à écrire dans le pipe

• Programme lecteur:

• Open utilise ici le nom du pipe et l’option O_RDONLY pour imposer la lecture seul depuis le pipe

• Elle retourne -1 en cas d’erreur, sinon c’est un entier qui est le descripteur du pipe ouvert

• La fonction read permet la lecture depuis le pipe en précisant le descripteur du pipe ouvert, le tableau de type char qui va contenir le message lu ainsi que sa taille

• Le travail du lecteur est terminé après avoir lu le message depuis le pipe avec succès

(7)

C. Mémoire partagée

• Dans server.c:

• Shmget permet de créer une mémoire partagée avec comme nom 5678, avec la taille précisée dans SHMSZ.

• L’option IPC_CREAT permet de créer un nouveau segment

• Si cette option n’est pas utilisée, la fonction va retrouver le segment qui porte le numéro précisé dans key et vérifie si l’utilisateur a la permission de l’utiliser.

• Ici, la permission est précisée: 0666

• L’utilisation de | dans l’appel de la fonction permet d’utiliser plusieurs options. Ici, IPC_CREAT et 0666 qui est le droit d’accès à la mémoire partagée

• Si la fonction retourne -1, alors c’est une erreur de création de la mémoire partagée

• Sinon, elle retourne l’identifiant de la mémoire partagé qui a été créee avec succès

• La fonction shmat permet d’attacher la mémoire partagée créée par shmget à l’espace mémoire du processus appelant

• Shmid est l’identifiant retourné par shmget

• Si le deuxième paramètre est NULL, le système peut choisir de rattacher l la mémoire partagée dans n’importe quel emplacement libre

• Le troisième paramètre permet d’ajouter des options

• En cas de réussite, elle renvoie l'adresse d'attachement du segment de mémoire partagée. En cas d'échec (void *) -1 est renvoyé,

(8)

C. Mémoire partagée

• Dans client.c:

• Ici, Shmget va localiser la mémoire partagée créée par le processus précédent

• Shmat permet d’attacher cette mémoire au processus appelant

• Ensuite, on affiche le contenu de cette mémoire jusqu’à trouver le caractère nul

• Après l’affichage, le processus va placer *** dans la mémoire partagée

• Dans server.c:

• Ce processus pourra faire une attente active jusqu’à trouver le caractère * dans la mémoire partagé. Il a donc détecté la modification de la mémoire partagée par l’autre processus

Références

Documents relatifs

Puis Papa passe la pipe à

- Un véhicule véhicule refusé au contrôle technique suite au mauvais comportement de son système de freinage. Temps : 1 séance :

La recherche que nous avons effectuée vise surtout à répondre à une problématique qui relève de la créativité langagière des étudiants sur divers plans et étudier

fostered. He added many new structures to the settlement, increased the revenue flowing through the colony, and even owned possibly the first stand-alone tavern in Canada. This

[r]

[r]

La force F appliquée par le dynamomètre, parallèle au plan incliné et dirigé vers le haut Le dynamique de ces 3 forces est fermé. TP : LE PLAN INCLINE TP : LE PLAN

Calculatrice interdite Correction © http://labolycee.org Étude du mouvement du projectile après