Page 1 F. Nolot Licence d`informatique 2003
Transcription
Page 1 F. Nolot Licence d`informatique 2003
Université de Reims Champagne-Ardenne U niversité de Reims Champagne-Ardenne Principe Moyen de communication inter-processus Les Tubes Un processus écrit des données dans le tube et l'autre les lit Utilisation de l'appel système int pipe (int descripteur[2]); En cas d'échec, retourne -1 Sinon retourne les descripteurs des 2 extrémités du tubes en argument Le descripteur d'indice 0 est la sortie du tube, ouvert en lecture seule Le descripteur d'indice 1 est l'entrée du tube, ouvert en écriture seule F. Nolot Licence d'informatique 2003-2004 1 Université de Reims Champagne-Ardenne F. Nolot Licence d'informatique 2003-2004 U niversité de Reims Champagne-Ardenne Lecture / écriture Communication entre 2 processus Elles se font par les commandes et Utilisation de l'appel système fork() Si la communication va du père vers le fils int read (int fd, char *tamp, int n); Le père ferme son descripteur de sortie de tube int write (int fd, char *tamp,int n); Le fils ferme son descripteur d'entrée de tube fd : descripteur du flux Fermeture d'un descripteur par close() tamp : endroit où vont être lu ou écrite les données close (int fd) n : le nombre d'octets à transférer fd : descripteur du flux Retourne le nombre d'octets transférés et -1 en cas d'erreur F. Nolot 2 Licence d'informatique 2003-2004 3 Université de Reims Champagne-Ardenne F. Nolot Licence d'informatique 2003-2004 4 U niversité de Reims Champagne-Ardenne Problème des tubes Les tubes nommés Comment faire communiquer 2 processus quelconques ? Un tube nommé possède un nom dans le système de fichiers Avec les tubes, nécessité que les processus aient un ancêtre commun (le créateur du tube) Le noeud du système de fichiers représentant le tube nommé est du type fifo Sa création se fait par la commande mkfifo() La solution : les tubes nommés int mkfifo (char *nom, mode_t mode) nom : nom du tube nommé mode : idem que pour la commande open Retourne 0 si la création a réussi et -1 en cas d'erreur F. Nolot Licence d'informatique 2003-2004 5 F. Nolot Licence d'informatique 2003-2004 6 Université de Reims Champagne-Ardenne U niversité de Reims Champagne-Ardenne Ouverture d'un tube nommé Utilisation de la commande Fermeture d'un tube nommé Utilisation de la commande close() int open(char *name, int flags, 0) int close(int fd) name : nom du tube à ouvrir fd : descripteur du flux flags : mode d'ouverture Retourne 0 en cas de succès et -1 sinon O_RDONLY : ouvre uniquement en lecture Suppression d'un tube nommé O_WRONLY : ouvre uniquement en écriture O_RDWR int unlink(const char *pathname) : ouvre en lecture et écriture Retourne un descripteur du flux ouvert ou -1 en cas d'erreur F. Nolot Licence d'informatique 2003-2004 7 F. Nolot Licence d'informatique 2003-2004 8