pipe(2) System Calls Manual pipe(2) NOM pipe, pipe2 - Creer un tube BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include int pipe(int pipefd[2]); #define _GNU_SOURCE /* See feature_test_macros(7) */ #include /* Definition des constantes O_* */ #include int pipe2(int pipefd[2], int flags); /* Sur Alpha, IA-64, MIPS, SuperH et SPARC/SPARC64, pipe() a le prototype suivant ; voir les VERSIONS */ #include struct fd_pair { long fd[2]; }; struct fd_pair pipe(void); DESCRIPTION pipe() cree un tube, un canal unidirectionnel de donnees qui peut etre utilise pour la communication entre processus. Le tableau pipefd est utilise pour renvoyer deux descripteurs de fichier faisant reference aux extremites du tube. pipefd[0] fait reference a l'extremite de lecture du tube. pipefd[1] fait reference a l'extremite d'ecriture du tube. Les donnees ecrites sur l'extremite d'ecriture du tube sont mises en memoire tampon par le noyau jusqu'a ce qu'elles soient lues sur l'extremite de lecture du tube. Pour plus de details, consultez pipe(7). Si flags est 0, alors pipe2() est identique a pipe(). Les valeurs suivantes peuvent etre incluses a l'aide d'un OU binaire dans flags pour obtenir differents comportements : O_CLOEXEC Placer l'attribut << close-on-exec >> (FD_CLOEXEC) sur les deux nouveaux descripteurs de fichiers. Consultez la description de cet attribut dans open(2) pour savoir pourquoi cela peut etre utile. O_DIRECT (depuis Linux 3.4) Creer un tube qui assure les E/S en mode << packet >>. Chaque operation write(2) vers le tube est executee avec un paquet distinct et les operations read(2) depuis le tube lisent un seul paquet a la fois. Notez les precisions suivantes : - Les operations d'ecriture dont la taille depasse PIPE_BUF octets (voir pipe(7)) seront fractionnees en plusieurs paquets. La constante PIPE_BUF est definie dans . - Si une operation read(2) indique une taille du tampon inferieure a celle du paquet a venir, alors seul le nombre d'octets demande sera lu et les octets supplementaires du paquet seront ecartes. Si l'on souhaite s'assurer que meme les paquets les plus longs seront lus, il suffit de definir la taille du tampon a PIPE_BUF (voir le point precedent). - Les paquets de longueur nulle ne sont pas acceptes (une operation read(2) qui indique une taille de tampon de longueur zero est sans effet et renvoie 0). Les anciens noyaux qui n'acceptent pas cet attribut renvoient une erreur EINVAL. Depuis Linux 4.5, il est possible de modifier le parametre O_DIRECT d'un descripteur de fichier de tube en utilisant fcntl(2). O_NONBLOCK Placer l'attribut d'etat de fichier O_NONBLOCK sur les descriptions de fichier ouvert auxquelles renvoient les nouveaux descripteurs de fichiers. Utiliser cet attribut economise des appels supplementaires a fcntl(2) pour obtenir le meme resultat. O_NOTIFICATION_PIPE Depuis Linux 5.8, le mecanisme de notification generale est construit sur le tube ou le noyau copie les messages de notification dans les tubes ouverts par l'espace utilisateur. Le proprietaire du tube doit dire au noyau quelles sources d'evenements a surveiller et des filtres peuvent aussi etre appliques pour selectionner quels sous-evenements doivent etre places dans le tube. VALEUR RENVOYEE S'il reussit, cet appel systeme renvoie 0. S'il echoue, il renvoie -1, errno est defini pour indiquer l'erreur et pipefd est laisse inchange. Sur Linux (et d'autres systemes), pipe() ne modifie pas pipefd en cas d'echec. Une exigence qui standardise ce comportement a ete ajoutee dans POSIX.1-2008 TC2. L'appel systeme pipe2() specifique a Linux ne modifie donc pas pipefd en cas d'echec. ERREURS EFAULT pipefd n'est pas valable. EINVAL (pipe2()) Valeur incorrecte dans flags. EMFILE La limite du nombre de descripteurs de fichiers par processus a ete atteinte. ENFILE La limite du nombre total de fichiers ouverts pour le systeme entier a ete atteinte. ENFILE La limite dure de l'utilisateur en memoire qu'il est possible d'allouer aux tubes a ete atteinte et l'appelant n'est pas privilegie ; voir pipe(7). ENOPKG (pipe2()) O_NOTIFICATION_PIPE a ete passe dans flags et la prise en charge pour les notifications (CONFIG_WATCH_QUEUE) n'est pas compilee dans le noyau. VERSIONS L'ABI SystemV sur certaines architectures permet d'utiliser plus d'un registre pour renvoyer plusieurs valeurs ; diverses architectures (Alpha, IA-64, MIPS, SuperH et SPARC/SPARC64) abusent de cette fonction pour implementer l'appel systeme pipe() de maniere operationnelle : l'appel ne prend aucun parametre et renvoie une paire de descripteurs de fichier comme code de retour en cas de succes. La fonction enveloppe pipe() de la glibc gere cela de maniere transparente. Voir syscall(2) pour des informations sur les registres utilises pour stocker le deuxieme descripteur de fichier. STANDARDS pipe() POSIX.1-2008. pipe2() Linux. HISTORIQUE pipe() POSIX.1-2001. pipe2() Linux 2.6.27, glibc 2.9. EXEMPLES Le programme suivant cree un tube, puis invoque fork(2) pour creer un processus enfant ; l'enfant herite d'un double du jeu de descripteurs de fichier qui se rapportent au meme tube. Apres le fork(2), chaque processus ferme les descripteurs dont il n'a pas besoin pour le tube (consultez pipe(7)). Le parent ecrit alors la chaine contenue dans l'argument de ligne de commande du programme dans le tube, et l'enfant lit cette chaine un octet a la fois dans le tube, et l'affiche sur la sortie standard. Source du programme #include #include #include #include #include int main(int argc, char *argv[]) { int pipefd[2]; char buf; pid_t cpid; if (argc != 2) { fprintf(stderr, "Utilisation : %s \n", argv[0]); exit(EXIT_FAILURE); } if (pipe(pipefd) == -1) { perror("pipe"); exit(EXIT_FAILURE); } cpid = fork(); if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); } if (cpid == 0) { /* L'enfant lit dans le tube */ close(pipefd[1]); /* Fermeture du descripteur en ecriture inutilise */ while (read(pipefd[0], &buf, 1) > 0) write(STDOUT_FILENO, &buf, 1); write(STDOUT_FILENO, "\n", 1); close(pipefd[0]); _exit(EXIT_SUCCESS); } else { /* Le parent ecrit argv[1] dans le tube */ close(pipefd[0]); /* Fermeture du descripteur en lecture inutilise */ write(pipefd[1], argv[1], strlen(argv[1])); close(pipefd[1]); /* Le lecteur verra EOF */ wait(NULL); /* Attente de l'enfant */ exit(EXIT_SUCCESS); } } VOIR AUSSI fork(2), read(2), socketpair(2), write(2), popen(3), vmsplice(2), write(2), popen(3), pipe(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 , Frederic Hantrais et Jean- Philippe MENGUAL 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(2)