1 UNIX AVANCE Yves PAGNOTTE – Janvier – COMMUNICATION INTER PROCESSUS : TUBES
2 OUTILS DE COMMUNICATION INTER PROCESSUS (IPC) sémaphores tubes files de messages segments de mémoire partagée
3 TUBES - opérateur | du shell - file d’octets de capacité fixe - un tube possède un i-node, donc un descripteur de fichier - mais un tube n’est pas un fichier ! - donc sans lien avec un répertoire Les tubes permettent de communiquer entre processus de même propriétaire
CREATION D’UN TUBE SOUS UNIX int pipe (int *) /* retourne 0 ou -1 si échec */ exemple :int p [2], r; r = pipe (p); if (r == -1) exit (1); /* p [0] : descripteur d’accès en lecture p [1] : descripteur d’accès en écriture */ 4 P [1]P [0]
5 FERMETURE D’UN TUBE Avec l’exemple précédent : - fermeture d‘ un descripteur close (p [0]) ou close (p [1]) - mais sans possibilité de réouverture
6 LECTURE DANS UN TUBE lire = prélever une information dans la file on ne peut pas relire plusieurs fois la même information avec l’exemple précédent : int x, p [2]; char y; …. pipe (p); …. read (p [0], 1, &y); read (p [0], sizeof (int), &x); P [1]
7 ECRITURE DANS UN TUBE écrire = ranger une information dans la file Avec l’exemple précédent : int x = 4, p [2]; char y = ‘ a ’; …. pipe (p); …. write (p [1], 1, &y); write (p [1], sizeof (int), &x);
8 GESTION D’UN TUBE (1) selon le modèle producteur-consommateur - un processus qui tente d ’écrire dans un tube plein est endormi jusqu’à la fin de cette situation - un processus qui tente de lire dans un tube insuffisamment rempli est endormi jusqu’à la fin de cette situation
9 GESTION D’UN TUBE (2) - un processus qui tente d’écrire dans un tube sans descripteur de lecture ouvert reçoit le signal SIGPIPE (met fin au processus par défaut) - un processus qui tente de lire dans un tube sans descripteur d’écriture ouvert ne lira que ce qui est disponible (read retourne le nombre d’octets lus)
10 TUBE ET HERITAGE Un tube possède des descripteurs un processus fils hérite des descripteurs des tubes ouverts par son père un tube permet donc une communication père - fils
11 Exemple int r, p [2]; pipe (p); r = fork (); if (r ==0) close (p [0]); else close (p [1]); Fils p[1] Père p[0]