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.
If a process attempts to read from an empty pipe, then read(2) will
block until data is available. If a process attempts to write to a
full pipe (see below), then write(2) blocks until sufficient data has
been read from the pipe to allow the write to complete.
Nonblocking I/O is possible by using the fcntl(2) F_SETFL operation to
enable the O_NONBLOCK open file status flag or by opening a fifo(7)
with O_NONBLOCK. If any process has the pipe open for writing, reads
fail with EAGAIN; otherwise--with no potential writers--reads succeed
and return empty.
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.
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)
La limite douce 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 tubes individuels crees par
l'utilisateur seront limites a une page et les essais pour
augmenter la capacite de tube n'aboutiront pas.
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 says that writes of less than PIPE_BUF bytes must be atomic:
the output data is written to the pipe as a contiguous sequence.
Writes of more than PIPE_BUF bytes may be nonatomic: the kernel may
interleave the data with data written by other processes. POSIX.1
requires PIPE_BUF to be at least 512 bytes. (On Linux, PIPE_BUF is
4096 bytes.) The precise semantics depend on whether the file
descriptor is nonblocking (O_NONBLOCK), whether there are multiple
writers to the pipe, and on n, the number of bytes to be written:
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.
Setting the O_ASYNC flag for the read end of a pipe causes a signal
(SIGIO by default) to be generated when new input becomes available on
the pipe. The target for delivery of signals must be set using the
fcntl(2) F_SETOWN command. On Linux, O_ASYNC is supported for pipes
and FIFOs only since 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.
This was racey. Multiple processes could pass point (1)
simultaneously, and then allocate pipe buffers that were accounted
for only in step (3), with the result that the user's pipe buffer
allocation could be pushed over the limit.
Depuis Linux 4.9, l'etape de prise en compte est realisee avant
l'allocation et l'operation echoue si la limite est depassee.
Before Linux 4.9, bugs similar to points (a) and (c) could also occur
when the kernel allocated memory for a new pipe buffer; that is, when
calling pipe(2) and when opening a previously unopened FIFO.
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.06 31 octobre 2023 pipe(7)