Les pipes sont des canaux de communication unidirectionnels entre un producteur et un consommateur.
Un tube est un inode disponible d'un système de fichiers. Le principe du fonctionnement du pipe provient du fait que l'appel système pipe retourne 2 descripteurs de fichiers vers le même inode :l'un est utilisé en écriture, l'autre en lecture. Les pointeurs de position sont gérés dans la table des inodes et non dans la table des fichiers. Quand un processus écrit dans le pipe, le compteur de position d'écriture est incrémenté. De même, quand un processus vient lire dans le pipe, le compteur de position de lecture est incrémenté. Quand le compteur de lecture à rejoint le compteur d'écriture, les 2 compteurs sont remis à 0.
![]() |
S'il n'y a rien à lire, le processus consommateur est bloqué. Si le pipe est plein, le processus producteur est bloqué (ce qui peut conduire à un fractionnement des données si d'autres processus écrivent dans le pipe). Le positionnement du flag O_NDELAY, permet d'éviter ce comportement (l'écriture renvoie le nombre d'octets effectivement écrits).
La gestion d'un pipe se fait sur les blocs d'accès direct de l'inode qui lui est affecté (la taille est donc limitée à 10 blocs). Comme ces blocs sont gérés dans le cache, les pipes sont donc gérés directement en mémoire et non sur le disque.
![]() |
Pour pouvoir utiliser un pipe, il est nécessaire de posséder le descripteur associé à ce pipe. Cela n'est donc possible qu'au sein d'une filiation de processus, ou en utilisant des processus de communication IPC.