PIPE

Section : Manuel du programmeur Linux (2)
Mise à jour de la version anglaise : 9 janvier 2008
Index Menu principal  

NOM

pipe - Créer un tube  

SYNOPSIS

#include <unistd.h>

int pipe(int pipefd[2]);  

DESCRIPTION

pipe() crée un tube, un canal unidirectionnel de données qui peut être utilisé pour la communication entre processus. Le tableau pipefd est utilisé pour renvoyé deux descripteurs de fichier faisant référence aux extrémités du tube. pipefd[0] fait référence à l'extrémité de lecture du tube. pipefd[1] fait référence à l'extrémité d'écriture du tube. Les données écrites sur l'extrémité d'écriture du tube sont mises en mémoire tampon par le noyau jusqu'à ce qu'elles soient lues sur l'extrémité de lecture du tube. Pour plus de détails, voir pipe(7).  

VALEUR RENVOYÉE

Cet appel renvoie 0 s'il réussit, ou -1 s'il échoue, auquel cas errno contient le code d'erreur.  

ERREURS

EFAULT
pipefd est invalide.
EMFILE
Trop de descripteurs de fichier sont utilisés par le processus.
ENFILE
La limite du nombre total de fichiers ouverts sur le système a été atteinte.
 

CONFORMITÉ

POSIX.1-2001.  

EXEMPLE

Le programme suivant crée un tube puis se dédouble (fork(2)) pour créer un processus fils. Le processus fils hérite d'un ensemble dupliqué de descripteurs de fichier qui font référence au même tube. Après le fork(2), chaque processus ferme les descripteurs dont il n'a pas besoin pour le tube (voir pipe(7)). Le père écrit alors la chaîne contenue dans l'argument de la ligne de commande du programme et le fils lit cette chaîne, un octet à la fois, qu'il affiche sur sa sortie standard.

#include <sys/wait.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int
main(int argc, char *argv[])
{
    int pipefd[2];
    pid_t cpid;
    char buf;

    assert(argc == 2);

    if (pipe(pipefd) == -1) {
        perror("pipe");
        exit(EXIT_FAILURE);
    }

    cpid = fork();
    if (cpid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    }

    if (cpid == 0) {    /* Le fils lit dans le tube */
        close(pipefd[1]);  /* Ferme l'extrémité d'écriture inutilisée */

        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 père écrit argv[1] dans le tube */
        close(pipefd[0]);       /* Ferme l'extrémité de lecture inutilisée */
        write(pipefd[1], argv[1], strlen(argv[1]));
        close(pipefd[1]);       /* Le lecteur verra EOF */
        wait(NULL);             /* Attente du fils */
        exit(EXIT_SUCCESS);
    }
}
 

VOIR AUSSI

fork(2), read(2), socketpair(2), write(2), popen(3), pipe(7)  

TRADUCTION

Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 10 octobre 1996 et révisée le 24 juin 2008.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 pipe ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.

 

Index

NOM
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
CONFORMITÉ
EXEMPLE
VOIR AUSSI
TRADUCTION

Dernière mise à jour : 24 juin 2008