| pipe(7) | Miscellaneous Information Manual | pipe(7) |
pipe – Exposé général sur les tubes et les FIFO
Les tubes et les FIFO (ou tubes nommés) fournissent un canal de communication interprocessus unidirectionnel. Un tube a une entrée et une sortie. Les données écrites à l'entrée du tube peuvent être lues à sa sortie.
Un tube est créé avec l'appel système pipe(2) qui crée un nouveau tube et renvoie deux descripteurs de fichier, l'un correspondant à l'entrée du tube et l'autre à la sortie. Les tubes peuvent être utilisés pour créer un canal de communication entre des processus associés ; consultez pipe(2) pour un exemple.
Une file d’attente FIFO (abréviation de « First In First Out » ou premier entré, premier sorti) a un nom sur le système de fichiers (créé avec mkfifo(3)) et est ouverte avec open(2). Tout processus peut ouvrir une FIFO si les permissions du fichier l'autorisent. La sortie est ouverte avec l'option O_RDONLY ; l'entrée est ouverte avec l'option O_WRONLY. Consultez fifo(7) pour plus de détails. Note : même si les FIFO ont un nom sur le système de fichiers, les entrées/sorties sur une FIFO n'impliquent pas d'opérations sur le périphérique sous‐jacent (s'il y en a un).
La seule différence entre les tubes et les FIFO est la manière dont ils sont créés et ouverts. Une fois ces tâches accomplies, les E/S sur les tubes et les FIFO ont strictement les mêmes sémantiques.
Si un processus essaie de lire dans un tube vide, read(2) bloquera jusqu'à ce que des données soient disponibles. Si un processus essaie d'écrire dans un tube plein (voir ci‐dessous), write(2) bloque jusqu'à ce que suffisamment de données aient été lues dans le tube pour permettre la réussite de l'écriture.
Des E/S non bloquantes sont possibles en utilisant l'opération F_SETFL de fcntl(2) pour activer l'attribut O_NONBLOCK d’état de fichier ouvert ou en ouvrant une fifo(7) avec O_NONBLOCK. Si le tube d'un processus est ouvert en écriture, les lectures échoue avec une erreur EAGAIN ; autrement, sans processus écrivant potentiel, les lectures réussissent et ne renvoient rien.
Le canal de communication fourni par un tube est un flux d'octets : il n'y a pas de notion de limite de messages.
Si tous les descripteurs de fichier correspondant à l'entrée d'un tube sont fermés, une tentative de lecture sur le tube renverra une condition de fin de fichier (read(2) renverra 0). Si tous les descripteurs de fichier correspondant à la sortie d'un tube sont fermés, une tentative d'écriture provoquera l'envoi du signal SIGPIPE au processus appelant. Si le processus appelant ignore ce signal, write(2) échoue avec l'erreur EPIPE. Une application utilisant pipe(2) et fork(2) doit utiliser des appels à close(2) afin de fermer les descripteurs de fichier superflus ; cela permet d'assurer que la condition de fin de ficher et SIGPIPE/EPIPE soient renvoyés correctement.
Il n'est pas possible d'invoquer lseek(2) sur un tube.
Un tube a une capacité limitée. Si le tube est plein, un write(2) bloquera ou échouera, selon que l'attribut O_NONBLOCK est activé ou non (voir ci‐dessous). Différentes implémentations ont différentes limites de capacité des tubes. Les applications ne doivent pas dépendre d'une capacité particulière, mais être conçues pour qu'un processus lecteur lise les données dès qu'elles sont disponibles de manière à ce qu'un processus écrivant ne soit pas bloqué.
Avant Linux 2.6.11, la capacité d'un tube était la même que la taille d'une page système (par exemple 4 096 octets sur i386). Depuis Linux 2.6.11, la capacité d'un tube est par défaut de 16 pages (c’est-à-dire 65 536 octets sur un système avec 4 096 octets comme taille de page). Depuis Linux 2.6.35, la capacité d’un tube est de 16 pages, mais la capacité peut être recherchée et définie en utilisant les opérations F_GETPIPE_SZ et F_SETPIPE_SZ de fcntl(2). Consultez fcntl(2) pour davantage d’informations.
L’opération ioctl(2) suivante, qui peut être appliquée à un descripteur de fichier faisant référence à n’importe quelle extrémité du tube, place un certain nombre d’octets non lus dans le tube dans le tampon int pointé par le dernier argument de l’appel :
ioctl(fd, FIONREAD, &nbytes);
L’opération FIONREAD n’est précisée dans aucune norme, mais est fournie dans beaucoup d’implémentations.
Dans Linux, les fichiers suivants contrôlent la quantité de mémoire pouvant être utilisée pour les tubes :
Avant Linux 4.9, quelques bogues affectaient la gestion des limites pipe-user-pages-soft et pipe-user-pages-hard. Consultez la section BOGUES.
POSIX.1-2001 indique que les écritures de moins de PIPE_BUF octets doivent être atomiques : les données produites sont écrites dans le tube de façon contiguë. Les écritures de plus de PIPE_BUF octets peuvent ne pas être atomiques : le noyau peut entrelacer les données avec des données écrites par d'autres processus. POSIX.1-2001 demande que PIPE_BUF soit au moins de 512 octets ; sous Linux, PIPE_BUF vaut 4 096 octets. La sémantique précise dépend de l'attribut non bloquant du descripteur de fichier (O_NONBLOCK), du nombre de processus écrivant dans le tube et de n, le nombre d'octets à écrire :
Les seuls attributs d'état de fichier ouvert qui peuvent s'appliquer aux tubes et aux FIFO sont O_NONBLOCK et O_ASYNC.
Activer l'attribut O_ASYNC à la sortie d'un tube provoque l'envoi d'un signal (SIGIO par défaut) lorsque de nouvelles données sont disponibles dans le tube. La cible de réception du signal doit être définie en utilisant la commande F_SETOWN de fcntl(2). Sous Linux, O_ASYNC n'est possible sur les tubes et les FIFO que depuis Linux 2.6.
Sur certains systèmes (mais pas sous Linux), les tubes sont bidirectionnels : des données peuvent être transmises dans les deux directions entre les extrémités du tube. Selon POSIX.1-2001, les tubes sont uniquement décrits comme unidirectionnels. Les applications portables doivent éviter de s'appuyer sur une sémantique bidirectionnelle des tubes.
Avant Linux 4.9, quelques bogues affectaient la gestion des limites pipe-user-pages-soft et pipe-user-pages-hard lors de l’utilisation de l’opération F_SETPIPE_SZ de fcntl(2) pour modifier la capacité d’un tube :
Avant Linux 4.9, des bogues similaires aux points (a) et (c) pourraient se produire quand le noyau alloue de la mémoire pour le nouveau tampon de tube, c’est-à-dire lors de l’appel pipe(2) et lors de l’ouverture d’une nouvelle FIFO précédemment non ouverte.
mkfifo(1), dup(2), fcntl(2), open(2), pipe(2), poll(2), select(2), socketpair(2), splice(2), stat(2), tee(2), vmsplice(2), mkfifo(3), epoll(7), fifo(7)
La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Cédric Boutillier <cedric.boutillier@gmail.com>, Frédéric Hantrais <fhantrais@gmail.com> et Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr>
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org.
| 2 mai 2024 | Pages du manuel de Linux 6.9.1 |