Vous êtes sur la page 1sur 3

Les tubes – La communication

Numéro de session

Intitulé de la session

1

Définition

2

Gestion des tubes

- Création

- Lecture

- Ecriture

- Fermeture

1 Session 1 : Généralités

1.1 Définition

Les tubes anonymes (pipes) permettent le transfert de données entre des processus parents selon le modèle FIFO (First In First Out) : les informations sont introduites par une extrémité et lues par l’autre.

1.2 Tubes // Fichiers

A la différence d’un fichier, une fois lues, les informations ne peuvent être lues à nouveau, elles sont physiquement retirées. Le tube représente un flot séquentiel de caractères. La mise en œuvre des tubes utilise le SGF (Système de Gestion de Fichiers) pour le stockage des données. Le noyau affecte un i-node au tube lors de sa création, ainsi que 2 descripteurs de fichiers : un pour l’écriture, l’autre pour la lecture. Les primitives de gestion des tubes sont identiques à celles de la gestion des fichiers.

Rappel :

Pour les fichiers, un processus fils hérite des tous les descripteurs de fichiers de son père. Il en est de même pour les signaux et les tubes.

1.3 Caractéristiques

Seuls les processus d’une même famille, le créateur du tube et ses descendants, peuvent partager l’accès à un tube : ils utilisent le principe d’héritage. Un tube n’est pas persistant, sa durée de vie est limitée à la durée de vie du processus qui l’a créé. Les tubes sont souvent utilisés implicitement au niveau du Shell par l’intermédiaire du caractère « | ».

Exemple :

Pour compter le nombre de lignes d’un fichier : more fichier | wc –l La sortie de la commande more fichier est prise en entrée de la commande wc-l.

Les accès à un tube sont synchronisés par le noyau, une seule écriture est autorisée à la fois. Si le tube est plein, le producteur est bloqué jusqu’à l’obtention d’une place disponible. De la même manière, si le tube est vide, le consommateur est bloqué jusqu’à ce que des données soient déposées.

Les tubes sont assimilables à des buffers implantés en mémoire et gérés par les primitives du SGF.

échange d'informations au travers d'un tube Il y a synchronisation sur la production et la

échange d'informations au travers d'un tube

Il y a synchronisation sur la production et la consommation de données. Il y a un lien de parenté entre le processus 1 et le processus 2.

2 Session 2 : Gestion des tubes

2.4 Création d’un tube

Syntaxe :

Int pipe(pdesc) Int pdesc[2] ; /*tableau de descripteurs des extrémités du tube*/

L’appel système pipe crée et ouvre un tube de communication et attribut 2 descripteurs de fichiers : -pdesc[0] contient le descripteur de l’extrémité du tube accessible en lecture. - pdesc[1] contient le descripteur de l’extrémité du tube accessible en écriture.

Valeur de retour :

- = 0 si succès,

- = -1 sinon

La variable errno est positionnée :

- EINFILE : table du SGF pleine.

- EMFILE : Nombre maximum de fichiers ouverts par le processus atteint.

2.5 Lecture d’un tube

Syntaxe :

Int read (desc, buff, taille) Int desc, /*descripteur d’extrémité en lecture du tube*/ Int taille, /*nombre d’octets à lire dans le tube*/ Char *buff; /*adresse à laquelle sont stockées les informations lues*/

Read() récupère taille octets dans le tube dont le descripteur est desc et les stocke en mémoire à partir de l’adresse buff.

Valeur de retour :

- = 0 si succès,

- = -1 sinon

La variable errno est positionnée :

- EFAULT : buff fait référence à une adresse se trouvant hors de l’espace d’adressage du processus.

- EINTR : un signal a été capturé pendant l’appel de la primitive Read.

Un processus qui souhaite lire des informations dans le tube peut être bloqué (par exemple parce que le tube est vide). Les possibilités pour le réveil d’un lecteur bloqué sont les suivantes: - un dépôt a été effectué

- l’extrémité en écriture du tube a été fermée.

2.6 Ecriture dans un tube

Syntaxe :

Int write (desc, buff, taille) Int desc, /*descripteur d’extrémité en écriture du tube*/ Int taille, /*nombre d’octets à écrire dans le tube*/ Char *buff; /*adresse à laquelle sont stockées les informations à écrire*/

Write() écrit taille octets à partir de l’adresse buff dans le tube dont le descripteur est desc.

Valeur de retour :

- = 0 si succès,

- = -1 sinon

Un processus qui souhaite écrire des informations dans le tube peut être bloqué (par exemple parce que le tube est plein). Les possibilités pour le réveil d’un rédacteur bloqué sont les suivantes: - un retrait a été effectué

- l’extrémité en lecture du tube a été fermée.

2.7 Fermeture d’un tube

Syntaxe :

Int close (desc) Int desc ; /*descripteur d’extrémité à fermer*/

Close() ferme l’extrémité du tube dont le descripteur est desc. Il libère ainsi une entrée dans la table des descripteurs de fichiers ouverts.

Valeur de retour :

- = 0 si succès,

- = -1 sinon

Ce chapitre a présenté les caractéristiques générales des tubes ainsi que les méthodes qui permettent leur utilisation : pipe(), read(), write() et close(). Cependant, nous avons pu voir que les tubes sont des moyens de communication unidirectionnels ; ainsi afin de communiquer dans les deux sens, il est nécessaire d’utiliser deux tubes. Nous verrons dans le module 224 qu’il existe d’autres moyens de communication entre des processus.