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)