.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2005 Michael Kerrisk .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH PIPE 7 "15 septembre 2017" Linux "Manuel du programmeur Linux" .SH NOM pipe – Exposé général sur les tubes et les FIFO .SH DESCRIPTION Les tubes et les FIFO (ou tubes nommés) fournissent un canal de communication interprocessus unidirectionnel. Un tube a une \fIentrée\fP et une \fIsortie\fP. Les données écrites à l'entrée du tube peuvent être lues à sa sortie. .PP Un tube est créé avec l'appel système \fBpipe\fP(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 \fBpipe\fP(2) pour un exemple. .PP 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 \fBmkfifo\fP(3)) et est ouverte avec \fBopen\fP(2). Tout processus peut ouvrir une FIFO si les permissions du fichier l'autorisent. La sortie est ouverte avec l'option \fBO_RDONLY\fP\ ; l'entrée est ouverte avec l'option \fBO_WRONLY\fP. Consultez \fBfifo\fP(7) pour plus de détails. \fINote\fP\ : 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\(hyjacent (s'il y en a un). .SS "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. .PP Si un processus essaie de lire dans un tube vide, \fBread\fP(2) bloquera jusqu'à ce que des données soient disponibles. Si un processus essaie d'écrire dans un tube plein (voir ci\(hydessous), \fBwrite\fP(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 \fBF_SETFL\fP de \fBfcntl\fP(2) pour activer l'attribut \fBO_NONBLOCK\fP d’état de fichier ouvert. .PP Le canal de communication fourni par un tube est un \fIflux d'octets\fP\ : il n'y a pas de notion de limite de messages. .PP 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 (\fBread\fP(2) renverra\ \fB0\fP). Si tous les descripteurs de fichier correspondant à la sortie d'un tube sont fermés, une tentative d'écriture provoquera l'envoi du signal \fBSIGPIPE\fP au processus appelant. Si le processus appelant ignore ce signal, \fBwrite\fP(2) échoue avec l'erreur \fBEPIPE\fP. Une application utilisant \fBpipe\fP(2) et \fBfork\fP(2) doit utiliser des appels à \fBclose\fP(2) afin de fermer les descripteurs de fichier superflus\ ; cela permet d'assurer que la condition de fin de ficher et \fBSIGPIPE\fP/\fBEPIPE\fP soient renvoyés correctement. .PP Il n'est pas possible d'invoquer \fBlseek\fP(2) sur un tube. .SS "Capacité d'un tube" Un tube a une capacité limitée. Si le tube est plein, un \fBwrite\fP(2) bloquera ou échouera, selon que l'attribut \fBO_NONBLOCK\fP est activé ou non (voir ci\(hydessous). 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é. .PP Dans les versions de Linux antérieures à 2.6.11, la capacité d'un tube était la même que la taille d'une page système (p.ex. 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 \fBF_GETPIPE_SZ\fP et \fBF_SETPIPE_SZ\fP de \fBfcntl\fP(2). Consultez \fBfcntl\fP(2) pour davantage d’informations. .PP L’opération \fBioctl\fP(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 \fIint\fP pointé par le dernier argument de l’appel\ : .PP ioctl(fd, FIONREAD, &nbytes); .PP .\" L’opération \fBFIONREAD\fP n’est précisée dans aucune norme, mais est fournie dans beaucoup d’implémentations. .SS "Fichiers /proc" Dans Linux, les fichiers suivants contrôlent la quantité de mémoire pouvant être utilisée pour les tubes\ : .TP \fI/proc/sys/fs/pipe\-max\-pages\fP (uniquement pour Linux 2.6.34) .\" commit b492e95be0ae672922f4734acf3f5d35c30be948 Une limite supérieure, en nombre de pages, sur la quantité qu’un utilisateur non privilégié (n’ayant pas la capacité \fBCAP_SYS_RESOURCE\fP) peut être définie pour un tube. .IP 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. .IP Cette interface a été supprimée dans Linux\ 2.6.35, en faveur de \fI/proc/sys/fs/pipe\-max\-size\fP. .TP \fI/proc/sys/fs/pipe\-max\-size\fP (depuis Linux 2.6.35) .\" commit ff9da691c0498ff81fdd014e7a0731dab2337dac .\" This limit is not checked on pipe creation, where the capacity is .\" always PIPE_DEF_BUFS, regardless of pipe-max-size La taille maximale (en octet) de tubes particuliers pouvant être définie par les utilisateurs n’ayant pas la capacité \fBCAP_SYS_RESOURCE\fP. 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. .IP 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 \fBwrite\fP(2) avec l’erreur \fBEINVAL\fP. .IP .\" commit 086e774a57fba4695f14383c0818994c0b31da7c 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. .TP \fI/proc/sys/fs/pipe\-user\-pages\-hard\fP (depuis Linux 4.5) .\" commit 759c01142a5d0f364a462346168a56de28a80f52 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é \fBCAP_SYS_RESOURCE\fP ni la capacité \fBCAP_SYS_ADMIN\fP). 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. .IP .\" The default was chosen to avoid breaking existing applications that .\" make intensive use of pipes (e.g., for splicing). Quand la valeur de cette limite est zéro (comportement par défaut ), aucune limite dure n’est appliquée. .TP \fI/proc/sys/fs/pipe\-user\-pages\-soft\fP (depuis Linux 4.5) .\" commit 759c01142a5d0f364a462346168a56de28a80f52 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é \fBCAP_SYS_RESOURCE\fP ni la capacité \fBCAP_SYS_ADMIN\fP). 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. .IP 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. .PP .\" Avant Linux\ 4.9, quelques bogues affectaient la gestion des limites \fIpipe\-user\-pages\-soft\fP et \fIpipe\-user\-pages\-hard\fP. Consultez la section BOGUES. .SS PIPE_BUF POSIX.1\-2001 indique que les écritures \fBwrite\fP(2) de moins de \fBPIPE_BUF\fP\ octets doivent être atomiques\ : les données produites sont écrites dans le tube de façon contiguë. Les écritures de plus de \fBPIPE_BUF\fP 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 \fBPIPE_BUF\fP soit au moins de 512\ octets\ ; sous Linux, \fBPIPE_BUF\fP vaut 4\ 096\ octets. La sémantique précise dépend de l'attribut non bloquant du descripteur de fichier (\fBO_NONBLOCK\fP), du nombre de processus écrivant dans le tube et de \fIn\fP, le nombre d'octets à écrire\ : .TP \fBO_NONBLOCK\fP désactivé, \fIn\fP <= \fBPIPE_BUF\fP Les \fIn\fP\ octets sont écrits de manière atomique\ ; \fBwrite\fP(2) peut bloquer s'il n'y a pas de place pour écrire \fIn\fP\ octets immédiatement. .TP \fBO_NONBLOCK\fP activé, \fIn\fP <= \fBPIPE_BUF\fP S'il y a la place d'écrire \fIn\fP\ octets dans le tube, \fBwrite\fP(2) réussit immédiatement, en écrivant les \fIn\fP\ octets\ ; sinon, \fBwrite\fP(2) échoue et définit \fIerrno\fP à \fBEAGAIN\fP. .TP \fBO_NONBLOCK\fP désactivé, \fIn\fP > \fBPIPE_BUF\fP L'écriture est non atomique\ : les données fournies à \fBwrite\fP(2) peuvent être entrelacées avec des écritures d'autres processus\ ; l'écriture bloque jusqu'à ce que \fIn\fP\ octets aient été écrits. .TP \fBO_NONBLOCK\fP activé, \fIn\fP > \fBPIPE_BUF\fP Si le tube est plein, \fBwrite\fP(2) échoue, en plaçant \fIerrno\fP à \fBEAGAIN\fP. Sinon, entre 1 et \fIn\fP\ octets peuvent être écrits (une «\ écriture partielle\ » peut se produire\ ; l'appelant doit vérifier la valeur de retour de \fBwrite\fP(2) pour voir combien d'octets ont réellement été écrits), et ces octets peuvent être entrelacés avec des écritures d'autres processus. .SS "Attributs d'état de fichier ouvert" Les seuls attributs d'état de fichier ouvert qui peuvent s'appliquer aux tubes et aux FIFO sont \fBO_NONBLOCK\fP et \fBO_ASYNC\fP. .PP Activer l'attribut \fBO_ASYNC\fP à la sortie d'un tube provoque l'envoi d'un signal (\fBSIGIO\fP 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 \fBF_SETOWN\fP de \fBfcntl\fP(2). Sous Linux, \fBO_ASYNC\fP n'est possible sur les tubes et les FIFO que depuis le noyau\ 2.6. .SS "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. .SS BOGUES .\" These bugs where remedied by a series of patches, in particular, .\" commit b0b91d18e2e97b741b294af9333824ecc3fadfd8 and .\" commit a005ca0e6813e1d796a7422a7e31d8b8d6555df1 Avant Linux\ 4.9, quelques bogues affectaient la gestion des limites \fIpipe\-user\-pages\-soft\fP et \fIpipe\-user\-pages\-hard\fP lors de l’utilisation de l’opération \fBF_SETPIPE_SZ\fP de \fBfcntl\fP(2) pour modifier la capacité d’un tube\ : .IP (1) 5 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. .IP Depuis Linux\ 4.9, la vérification de limite inclut la mémoire nécessaire pour la nouvelle capacité de tube. .IP (2) 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. .IP 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. .IP (3) La prise en compte et la vérification sur les limites sont faites comme suit\ : .IP .RS .PD 0 .IP (a) 4 Test pour savoir si l’utilisateur a dépassé la limite. .IP (b) Allocation du tampon pour le nouveau tube. .IP (c) Comparaison de la nouvelle allocation avec les limites. .PD .RE .IP Cela est risqué. Plusieurs processus peuvent passer le point\ (a) simultanément et puis allouer des tampons de tube qui sont pris en compte lors de l’étape\ (c), avec comme résultat que l’allocation du tampon de tube de l’utilisateur peut dépasser la limite. .IP 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. .PP Avant Linux\ 4.9, des bogues similaires aux points (1) et\ (3) pourraient se produire quand le noyau alloue de la mémoire pour le nouveau tampon de tube, c’est\-à\-dire lors de l’appel \fBpipe\fP(2) et lors de l’ouverture d’une nouvelle FIFO précédemment non ouverte. .SH "VOIR AUSSI" \fBmkfifo\fP(1), \fBdup\fP(2), \fBfcntl\fP(2), \fBopen\fP(2), \fBpipe\fP(2), \fBpoll\fP(2), \fBselect\fP(2), \fBsocketpair\fP(2), \fBsplice\fP(2), \fBstat\fP(2), \fBtee\fP(2), \fBvmsplice\fP(2), \fBmkfifo\fP(3), \fBepoll\fP(7), \fBfifo\fP(7) .SH COLOPHON Cette page fait partie de la publication\ 5.10 du projet \fIman\-pages\fP Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page peuvent être trouvées à l'adresse \%https://www.kernel.org/doc/man\-pages/. .PP .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot , Cédric Boutillier , Frédéric Hantrais et Jean-Paul Guillonneau . .PP Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. .PP Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à .MT debian-l10n-french@lists.debian.org .ME .