PIPE(2)

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.