pipe(7) Miscellaneous Information Manual pipe(7)
NOM
pipe - Expose general sur les tubes et les FIFO
DESCRIPTION
Les tubes et les FIFO (ou tubes nommes) fournissent un canal de
communication interprocessus unidirectionnel. Un tube a une entree et
une sortie. Les donnees ecrites a l'entree du tube peuvent etre lues a
sa sortie.
Un tube est cree avec l'appel systeme pipe(2) qui cree un nouveau tube
et renvoie deux descripteurs de fichier, l'un correspondant a l'entree
du tube et l'autre a la sortie. Les tubes peuvent etre utilises pour
creer un canal de communication entre des processus associes ;
consultez pipe(2) pour un exemple.
Une file d'attente FIFO (abreviation de << First In First Out >> ou
premier entre, premier sorti) a un nom sur le systeme de fichiers (cree
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'entree est ouverte avec l'option
O_WRONLY. Consultez fifo(7) pour plus de details. Note : meme si les
FIFO ont un nom sur le systeme de fichiers, les entrees/sorties sur une
FIFO n'impliquent pas d'operations sur le peripherique sous-jacent
(s'il y en a un).
E/S sur les tubes et les FIFO
La seule difference entre les tubes et les FIFO est la maniere dont ils
sont crees et ouverts. Une fois ces taches accomplies, les E/S sur les
tubes et les FIFO ont strictement les memes semantiques.
Si un processus essaie de lire dans un tube vide, read(2) bloquera
jusqu'a ce que des donnees soient disponibles. Si un processus essaie
d'ecrire dans un tube plein (voir ci-dessous), write(2) bloque jusqu'a
ce que suffisamment de donnees aient ete lues dans le tube pour
permettre la reussite de l'ecriture.
Des E/S non bloquantes sont possibles en utilisant l'operation F_SETFL
de fcntl(2) pour activer l'attribut O_NONBLOCK d'etat de fichier ouvert
ou en ouvrant une fifo(7) avec O_NONBLOCK. Si le tube d'un processus
est ouvert en ecriture, les lectures echoue avec une erreur EAGAIN ;
autrement, sans processus ecrivant potentiel, les lectures reussissent
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 a l'entree d'un tube
sont fermes, 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 a la sortie d'un tube sont
fermes, une tentative d'ecriture provoquera l'envoi du signal SIGPIPE
au processus appelant. Si le processus appelant ignore ce signal,
write(2) echoue avec l'erreur EPIPE. Une application utilisant pipe(2)
et fork(2) doit utiliser des appels a 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 renvoyes
correctement.
Il n'est pas possible d'invoquer lseek(2) sur un tube.
Capacite d'un tube
Un tube a une capacite limitee. Si le tube est plein, un write(2)
bloquera ou echouera, selon que l'attribut O_NONBLOCK est active ou non
(voir ci-dessous). Differentes implementations ont differentes limites
de capacite des tubes. Les applications ne doivent pas dependre d'une
capacite particuliere, mais etre concues pour qu'un processus lecteur
lise les donnees des qu'elles sont disponibles de maniere a ce qu'un
processus ecrivant ne soit pas bloque.
Before Linux 2.6.11, the capacity of a pipe was the same as the system
page size (e.g., 4096 bytes on i386). Since Linux 2.6.11, the pipe
capacity is 16 pages (i.e., 65,536 bytes in a system with a page size
of 4096 bytes). Since Linux 2.6.35, the default pipe capacity is 16
pages, but the capacity can be queried and set using the fcntl(2)
F_GETPIPE_SZ and F_SETPIPE_SZ operations. See fcntl(2) for more
information. Since Linux 4.5, the default pipe capacity is lower than
16 pages when the pipe-user-pages-soft limit is exceeded.
L'operation ioctl(2) suivante, qui peut etre appliquee a un descripteur
de fichier faisant reference a n'importe quelle extremite du tube,
place un certain nombre d'octets non lus dans le tube dans le tampon
int pointe par le dernier argument de l'appel :
ioctl(fd, FIONREAD, &nbytes);
L'operation FIONREAD n'est precisee dans aucune norme, mais est fournie
dans beaucoup d'implementations.
Fichiers /proc
Dans Linux, les fichiers suivants controlent la quantite de memoire
pouvant etre utilisee pour les tubes :
/proc/sys/fs/pipe-max-pages (uniquement pour Linux 2.6.34)
Une limite superieure, en nombre de pages, sur la quantite qu'un
utilisateur non privilegie (n'ayant pas la capacite
CAP_SYS_RESOURCE) peut etre definie pour un tube.
La valeur par defaut pour cette limite est de 16 fois la
quantite par defaut pour le tube (voir ci-dessus). La limite
basse est de deux pages.
Cette interface a ete supprimee dans Linux 2.6.35, en faveur de
/proc/sys/fs/pipe-max-size.
/proc/sys/fs/pipe-max-size (depuis Linux 2.6.35)
La taille maximale (en octet) de tubes particuliers pouvant etre
definie par les utilisateurs n'ayant pas la capacite
CAP_SYS_RESOURCE. La valeur assignee dans ce fichier peut etre
arrondie a la valeur superieure pour refleter la valeur
reellement employee pour une mise en oeuvre pratique. Pour
determiner cette valeur arrondie, affichez le contenu de ce
fichier apres lui avoir assigne une valeur.
La valeur par defaut pour ce fichier est 1 048 576 (1 Mibit). La
valeur minimale qui peut etre assignee a cette page est la
taille de page du systeme. Un essai d'une limite inferieure a
cette taille de page provoque l'echec de write(2) avec l'erreur
EINVAL.
Depuis Linux 4.9, la valeur dans ce fichier agit comme un
plafond pour la capacite par defaut pour un nouveau tube ou une
FIFO nouvellement ouverte.
/proc/sys/fs/pipe-user-pages-hard (depuis Linux 4.5)
La limite dure de la taille totale (en nombre de pages) de tous
les tubes crees ou definis par un utilisateur particulier non
privilegie (c'est-a-dire n'ayant ni la capacite CAP_SYS_RESOURCE
ni la capacite CAP_SYS_ADMIN). Aussi longtemps que le nombre
total de pages allouees pour les tampons de tube pour cet
utilisateur est a cette limite, les essais pour creer de
nouveaux tubes n'aboutiront pas et les essais pour augmenter la
capacite de tube n'aboutiront pas.
Quand la valeur de cette limite est zero (comportement par
defaut ), aucune limite dure n'est appliquee.
/proc/sys/fs/pipe-user-pages-soft (depuis Linux 4.5)
The soft limit on the total size (in pages) of all pipes created
or set by a single unprivileged user (i.e., one with neither the
CAP_SYS_RESOURCE nor the CAP_SYS_ADMIN capability). So long as
the total number of pages allocated to pipe buffers for this
user is at this limit, individual pipes created by a user will
be limited to two pages (one page before Linux 5.14), and
attempts to increase a pipe's capacity will be denied.
Quand la valeur de cette limite est zero, aucune limite douce
n'est appliquee. La valeur par defaut dans ce fichier est 16 384
qui permet de creer jusqu'a 1 024 tubes avec la capacite par
defaut.
Avant Linux 4.9, quelques bogues affectaient la gestion des limites
pipe-user-pages-soft et pipe-user-pages-hard. Consultez la section
BOGUES.
PIPE_BUF
POSIX.1-2001 indique que les ecritures de moins de PIPE_BUF octets
doivent etre atomiques : les donnees produites sont ecrites dans le
tube de facon contigue. Les ecritures de plus de PIPE_BUF octets
peuvent ne pas etre atomiques : le noyau peut entrelacer les donnees
avec des donnees ecrites 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 semantique precise depend de l'attribut non bloquant
du descripteur de fichier (O_NONBLOCK), du nombre de processus ecrivant
dans le tube et de n, le nombre d'octets a ecrire :
O_NONBLOCK desactive, n <= PIPE_BUF
Les n octets sont ecrits de maniere atomique ; write(2) peut
bloquer s'il n'y a pas de place pour ecrire n octets
immediatement.
O_NONBLOCK active, n <= PIPE_BUF
S'il y a la place d'ecrire n octets dans le tube, write(2)
reussit immediatement, en ecrivant les n octets ; sinon,
write(2) echoue et definit errno a EAGAIN.
O_NONBLOCK desactive, n > PIPE_BUF
L'ecriture est non atomique : les donnees fournies a write(2)
peuvent etre entrelacees avec des ecritures d'autres processus ;
l'ecriture bloque jusqu'a ce que n octets aient ete ecrits.
O_NONBLOCK active, n > PIPE_BUF
Si le tube est plein, write(2) echoue, en placant errno a
EAGAIN. Sinon, entre 1 et n octets peuvent etre ecrits (une
<< ecriture partielle >> peut se produire ; l'appelant doit
verifier la valeur de retour de write(2) pour voir combien
d'octets ont reellement ete ecrits), et ces octets peuvent etre
entrelaces avec des ecritures d'autres processus.
Attributs d'etat de fichier ouvert
Les seuls attributs d'etat de fichier ouvert qui peuvent s'appliquer
aux tubes et aux FIFO sont O_NONBLOCK et O_ASYNC.
Activer l'attribut O_ASYNC a la sortie d'un tube provoque l'envoi d'un
signal (SIGIO par defaut) lorsque de nouvelles donnees sont disponibles
dans le tube. La cible de reception du signal doit etre definie 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.
Notes sur la portabilite
Sur certains systemes (mais pas sous Linux), les tubes sont
bidirectionnels : des donnees peuvent etre transmises dans les deux
directions entre les extremites du tube. Selon POSIX.1-2001, les tubes
sont uniquement decrits comme unidirectionnels. Les applications
portables doivent eviter de s'appuyer sur une semantique
bidirectionnelle des tubes.
BOGUES
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'operation F_SETPIPE_SZ de fcntl(2) pour modifier la capacite d'un
tube :
(a) Lors de l'augmentation de la capacite du tube, les verifications
sur les limites douce et dure sont faites sur la consommation
existante et excluent la memoire necessaire pour la capacite
augmentee du tube. La nouvelle augmentation de capacite du tube
pourrait pousser la memoire totale utilisee par l'utilisateur pour
les tubes au-dessus (possiblement tres au dela) de la limite. Cela
pourrait aussi declencher le probleme expose ci-apres.
Depuis Linux 4.9, la verification de limite inclut la memoire
necessaire pour la nouvelle capacite de tube.
(b) Les verifications de limite sont realisees meme si la nouvelle
capacite du tube est inferieure a la capacite du tube existant.
Cela pourrait conduire a des problemes si un utilisateur definit
une capacite importante de tube et que les limites sont abaissees,
avec comme resultat que l'utilisateur ne pourrait plus abaisser la
capacite du tube.
Depuis Linux 4.9, les verifications des limites sont realisees
uniquement lors de l'augmentation de capacite de tube. Un
utilisateur non privilegie peut toujours diminuer la capacite de
tube.
(c) La prise en compte et la verification sur les limites sont faites
comme suit :
(1) Test pour savoir si l'utilisateur a depasse la limite.
(2) Allocation du tampon pour le nouveau tube.
(3) Comparaison de la nouvelle allocation avec les limites.
Cela est risque. Plusieurs processus peuvent passer le point (1)
simultanement et puis allouer des tampons de tube qui sont pris en
compte lors de l'etape (3), avec comme resultat que l'allocation
du tampon de tube de l'utilisateur peut depasser la limite.
Depuis Linux 4.9, l'etape de prise en compte est realisee avant
l'allocation et l'operation echoue si la limite est depassee.
Avant Linux 4.9, des bogues similaires aux points (a) et (c) pourraient
se produire quand le noyau alloue de la memoire pour le nouveau tampon
de tube, c'est-a-dire lors de l'appel pipe(2) et lors de l'ouverture
d'une nouvelle FIFO precedemment non ouverte.
VOIR AUSSI
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)
TRADUCTION
La traduction francaise de cette page de manuel a ete creee par
Christophe Blaess , Stephan Rafin
, Thierry Vignaud ,
Francois Micaux, Alain Portal , Jean-Philippe
Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas
Huriaux , Nicolas Francois
, Florentin Duneau
, Simon Paillard , Denis Barbier , David Prevot
, Cedric Boutillier ,
Frederic Hantrais et Jean-Paul Guillonneau
Cette traduction est une documentation libre ; veuillez vous reporter a
la GNU General Public License version 3
concernant les conditions
de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE.
Si vous decouvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message a .
Pages du manuel de Linux 6.12 29 aout 2024 pipe(7)