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);