Man page - pipe(7)

Packages contains this manual

Available languages:

en fr pl ja ru

Manual

pipe

NOM
DESCRIPTION
E/S sur les tubes et les FIFO
CapacitĂ© d’un tube
Fichiers /proc
PIPE_BUF
Attributs d’état de fichier ouvert
Notes sur la portabilité
BOGUES
VOIR AUSSI
TRADUCTION

NOM

pipe – ExposĂ© gĂ©nĂ©ral sur les tubes et les FIFO

DESCRIPTION

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).

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 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.

CapacitĂ© d’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.

Fichiers /proc

Dans Linux, les fichiers suivants contrĂŽlent la quantitĂ© de mĂ©moire pouvant ĂȘtre utilisĂ©e pour les tubes :
/proc/sys/fs/pipe-max-pages
(uniquement pour Linux 2.6.34)

Une limite supĂ©rieure, en nombre de pages, sur la quantitĂ© qu’un utilisateur non privilĂ©giĂ© (n’ayant pas la capacitĂ© CAP_SYS_RESOURCE ) peut ĂȘtre dĂ©finie pour un tube.

La valeur par défaut pour cette limite est de 16 fois la quantité par défaut pour le tube (voir ci-dessus). La limite basse est de deux pages.

Cette interface a été supprimée 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 ĂȘtre dĂ©finie par les utilisateurs n’ayant pas la capacitĂ© CAP_SYS_RESOURCE . La valeur assignĂ©e dans ce fichier peut ĂȘtre arrondie Ă  la valeur supĂ©rieure pour reflĂ©ter la valeur rĂ©ellement employĂ©e pour une mise en Ɠuvre pratique. Pour dĂ©terminer cette valeur arrondie, affichez le contenu de ce fichier aprĂšs lui avoir assignĂ© une valeur.

La valeur par dĂ©faut pour ce fichier est 1 048 576 (1 Mibit). La valeur minimale qui peut ĂȘtre assignĂ©e Ă  cette page est la taille de page du systĂšme. Un essai d’une limite infĂ©rieure Ă  cette taille de page provoque l’échec de write (2) avec l’erreur EINVAL .

Depuis Linux 4.9, la valeur dans ce fichier agit comme un plafond pour la capacité par défaut 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 créés ou dĂ©finis par un utilisateur particulier non privilĂ©giĂ© (c’est-Ă -dire n’ayant ni la capacitĂ© CAP_SYS_RESOURCE ni la capacitĂ© CAP_SYS_ADMIN ). Aussi longtemps que le nombre total de pages allouĂ©es pour les tampons de tube pour cet utilisateur est Ă  cette limite, les essais pour crĂ©er de nouveaux tubes n’aboutiront pas et les essais pour augmenter la capacitĂ© de tube n’aboutiront pas.

Quand la valeur de cette limite est zĂ©ro (comportement par dĂ©faut ), aucune limite dure n’est appliquĂ©e.

/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 créés ou dĂ©finis par un utilisateur particulier non privilĂ©giĂ© (c’est-Ă -dire n’ayant ni la capacitĂ© CAP_SYS_RESOURCE ni la capacitĂ© CAP_SYS_ADMIN ). Aussi longtemps que le nombre total de pages allouĂ©es pour les tampons de tube pour cet utilisateur est Ă  cette limite, les tubes individuels créés par l’utilisateur seront limitĂ©s Ă  une page et les essais pour augmenter la capacitĂ© de tube n’aboutiront pas.

Quand la valeur de cette limite est zĂ©ro, aucune limite douce n’est appliquĂ©e. La valeur par dĂ©faut dans ce fichier est 16 384 qui permet de crĂ©er jusqu’à 1 024 tubes avec la capacitĂ© par dĂ©faut.

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 Ă©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 :
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Ă©diatement.

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 dĂ©finit 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 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.

Notes sur la portabilité

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.

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’opĂ©ration F_SETPIPE_SZ de fcntl (2) pour modifier la capacitĂ© d’un tube :

(a)

Lors de l’augmentation de la capacitĂ© du tube, les vĂ©rifications sur les limites douce et dure sont faites sur la consommation existante et excluent la mĂ©moire nĂ©cessaire pour la capacitĂ© augmentĂ©e du tube. La nouvelle augmentation de capacitĂ© du tube pourrait pousser la mĂ©moire totale utilisĂ©e par l’utilisateur pour les tubes au-dessus (possiblement trĂšs au delĂ ) de la limite. Cela pourrait aussi dĂ©clencher le problĂšme exposĂ© ci-aprĂšs.

Depuis Linux 4.9, la vérification de limite inclut la mémoire nécessaire pour la nouvelle capacité de tube.

(b)

Les vĂ©rifications de limite sont rĂ©alisĂ©es mĂȘme si la nouvelle capacitĂ© du tube est infĂ©rieure Ă  la capacitĂ© du tube existant. Cela pourrait conduire Ă  des problĂšmes si un utilisateur dĂ©finit une capacitĂ© importante de tube et que les limites sont abaissĂ©es, avec comme rĂ©sultat que l’utilisateur ne pourrait plus abaisser la capacitĂ© du tube.

Depuis Linux 4.9, les vĂ©rifications des limites sont rĂ©alisĂ©es uniquement lors de l’augmentation de capacitĂ© de tube. Un utilisateur non privilĂ©giĂ© peut toujours diminuer la capacitĂ© de tube.

(c)

La prise en compte et la vérification sur les limites sont faites comme suit :

(1)

Test pour savoir si l’utilisateur a dĂ©passĂ© la limite.

(2)

Allocation du tampon pour le nouveau tube.

(3)

Comparaison de la nouvelle allocation avec les limites.

Cela est risquĂ©. Plusieurs processus peuvent passer le point (1) simultanĂ©ment et puis allouer des tampons de tube qui sont pris en compte lors de l’étape (3), avec comme rĂ©sultat que l’allocation du tampon de tube de l’utilisateur peut dĂ©passer la limite.

Depuis Linux 4.9, l’étape de prise en compte est rĂ©alisĂ©e avant l’allocation et l’opĂ©ration Ă©choue si la limite est dĂ©passĂ©e.

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.

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 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 .