Skip to main content

Tubes et tubes nommés

Les tubes sont un mécanisme de communication qui permet de réaliser des communications entre processus osus forme d'un flot continu d'octets. Les tubes sont un des éléments de l'agrément d'utilisation d'UNIX. C'est ce mécanisme qui permet l'approche filtre de la conception sous UNIX. Mécanisme de communication lié au système de gestion de fichier, les tubes nommés ou non sont des paires d'entrées de la table des fichiers ouverts, associées à une inode en mémoire gérée par un driver spécifique. Une entrée est utilisée par les processus qui écrivent dans le tube une entrée pour les lecteurs du tube.

Les tubes ordinaires (pipe)

Un tube est matérialisé par deux entrées de la table des ouvertures de fichiers, une de ces entrées est ouverte en écriture (l'entrée du tube), l'autre en lecture (sortie du tube). Ces deux entrées de la table de fichiers ouverts nous donnent le nombre de descripteurs qui pointent sur elles. Ces valeurs peuvent être traduites comme :

  • nombre de lecteurs = nombre de descripteurs associés à l'entrée ouverte en lecture. On ne peut pas écrire dans un tube sans lecteur.
  • nombre d'écrivains = nombre de descripteurs associés à l'entrée ouverte en écriture. La nullité de ce nombre définit le comportement de la primitive read lorsque le tube est vide.

Création de tubes ordinaires

Un processus ne peut utiliser que les tubes qu'il a créés lui-même par la primitive pipe ou qu'il a hérité de son père grâce à l'héritage des descripteurs à travers fork et exec.

#include <unistd.h>
int pipe(int p[2]);

On ne peut pas manipuler les descripteurs de tubes avec les fonctions et primitives : lseek, ioctl, tcsetattr et tcgetattr, comme il n'y a pas de périphérique associé au tube (tout est fait en mémoire).

Lecture dans un tube

On utilise l'appel système read.

int nb_lu;
nb_lu = read(p[0],buffer, TAILLE_READ);

Remarquer que la lecture se fait dans le descripteur p[0]. Comportement de l'appel : Si le tube n'est pas vide et contient taille caractères :

lecture de nb_lu = min(taille, TAILLE_READ) caractères

Si le tube est vide :

  • Si le nombre d'écrivains est nul
alors c'est la fin de fichier et nb_lu est nul
  • Si le nombre d'écrivains est non nul
Si lecture bloquante alors sommeil
Si lecture non bloquante alors en fonction de l'indicateur
O_NONBLOCK nb_lu = -1 et errno=EAGAIN
O_NDELAY nb_lu = 0

Écriture dans un tube

nb_ecrit = write(p[1],buf,n);

L'écriture est atomique si le nombre de caractères à écrire est inférieur à PIPE_BUF, la taille du tube du sur le système.

Interblocage avec des tubes

Un même processus a deux accès à un tube, un accès en lecture, un accès en écriture et essai de lire sur le tube vide en mode non bloquante, le processus est bloqué indéfiniment dans la primitive read. Avec deux processus : deux tubes entre les deux processus, tous les deux bloqués en lecture ou tous les deux bloqués en écriture, tous les deux en attente d'une action de l'autre processus.

Les tubes nommés

Les tubes nommés sont des tubes qui existent dans le système de fichier et peuvent être ouverts grâce à une référence. Il faut préalablement créer le tube nommé dans le système de fichiers, grâce à la primitive mknob, avant de pouvoir l'ouvrir avec la primitive open

int mknob(reference, mode | S_IFIFO,O);