Provided by:
manpages-fr_2.45.1-1_all 
NOM
pipe - Panorama des tubes et des FIFO
DESCRIPTION
Les tubes et les FIFO (ou tubes nommés) fournissent un canal de commu‐
nication 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 fichiers, 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 liés ; voir pipe(2)
pour un exemple.
Un FIFO (abréviation de First In First Out) a un nom sur le système de
fichiers (créé avec mkfifo(3)), et est ouvert avec open(2). Tout pro‐
cessus peut ouvrir un 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. Voir 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 un FIFO n’impliquent pas d’opérations sur le périphérique
sous‐jacent (s’il y en a un).
E/S sur les tubes et les FIFO
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 avant de
permettre la réussite de l’écriture. Des E/S non bloquantes sont possi‐
bles en utilisant l’opération F_SETFL de fcntl(2) pour activer
l’attribut O_NONBLOCK.
Le canal de communication fourni par un tube est un flot d’octets : il
n’y a pas de notion de limite entre messages.
Si tous les descripteurs de fichiers correspondant à l’entrée d’un tube
sont fermés, une tentative de lecture sur le tube renverra une condi‐
tion de fin de fichier (read(2) renverra 0). Si tous les descripteurs
de fichiers correspondant à la sortie d’un tube sont fermés, une tenta‐
tive 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
fichiers superflus ; ceci permet d’assurer que la condition de fin de
ficher et SIGPIPE/EPIPE sont renvoyés correctement.
Il n’est pas possible d’invoquer lseek(2) sur un tube.
Capacit d un tube
Un tube a une capacité limitée. Si le tube est plein, un write(2) blo‐
quera 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, pour qu’un processus
écrivain ne soit pas bloqué.
Dans les versions de Linux antérieures à 2.6.11, la capacité d’un tube
était la taille d’une page système (p.ex. 4096 octets sur x86). Depuis
Linux 2.6.11, la capacité d’un tube est de 65536 octets.
PIPE_BUF
POSIX.1-2001 indique que les écritures de moins que PIPE_BUF octets
doivent être atomiques : les données sont écrites dans le tube de façon
contiguë. Les écritures de plus que PIPE_BUF peuvent ne pas être atom‐
iques : 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
512 octets. (Sous Linux, PIPE_BUF vaut 4096 octets.) La sémantique
précise dépend de l’attribut non-bloquant du descripteur de fichier
(O_NONBLOCK), du nombre d’écrivains dans le tube, et de n, le nombre
d’octets à écrire :
O_NONBLOCK désactivé, n <= PIPE_BUF
Les n octets sont écrits de manière atomique ; write(2) peut
bloquer s’il n’y a pas de place pour écrire n octets immédiate‐
ment.
O_NONBLOCK activé, n <= PIPE_BUF
S’il y a la place d’écrire n octets dans le tube, write(2)
réussit immédiatement, en écrivant les n octets ; sinon,
write(2) échoue, et fixe errno à EAGAIN.
O_NONBLOCK désactivé, n > PIPE_BUF
L’écriture est non atomique : les données fournies à write(2)
peuvent être entrelacées avec des écritures d’autres processus ;
l’écriture bloque jusqu’à ce que n octets aient été écrits.
O_NONBLOCK activé, n > PIPE_BUF
Si le tube est plein, write(2) échoue, en plaçant errno à
EAGAIN. Sinon, entre 1 et n octets peuvent être écrits (une
« écriture partielle » peut se produire ; l’appelant doit
vérifier la valeur de retour de write(2) pour voir combien
d’octets ont réellement été écrits), et ces octets peuvent être
entrelacés avec des écritures d’autres processus.
Attributs d tat de fichier ouvert
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
sur le tube (voir fcntl(2) pour les détails). Sous Linux, O_ASYNC n’est
possible sur les tubes et les FIFO que depuis le noyau 2.6.
Notes sur la portabilit
Sur certains systèmes (mais pas sous Linux), les tubes sont bidirec‐
tionnels : des données peuvent être transmises dans les deux directions
entre les bouts 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.
dup(2), fcntl(2), open(2), pipe(2), poll(2), select(2), socketpair(2),
stat(2), mkfifo(3), epoll(7), fifo(7)
TRADUCTION
Cette page de manuel a été traduite et mise à jour par Christophe
Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
disposition sur http://manpagesfr.free.fr/.
Les mises à jour et corrections de la version présente dans Debian sont
directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
francophone de traduction de Debian.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande « man -L C <section> <page_de_man> ».