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