Section courante

A propos

Section administrative du site

PIPE

Tuyau
C pour Unix unistd.h

Syntaxe

int pipe(int fildes[2]);

Paramètres

Nom Description
fildes[0] Ce paramètre permet d'indiquer un descripteur de fichier sera utilisé pour la lecture des données dans le tube.
fildes[1] Ce paramètre permet d'indiquer un descripteur de fichier sera utilisé pour l'écriture dans le tube.

Retour

Une fois l'opération terminée, la valeur 0 est renvoyée ; sinon, la valeur -1 est renvoyée et errno est défini pour indiquer l'erreur. Aucun descripteur de fichier n'est alloué et le contenu de fildes reste inchangé.

Description

Cette fonction permet d'effectuer la création d'un canal entre processus.

Remarques

Erreurs

La fonction pipe() échoue si :

Constante Description
EMFILE Tous les descripteurs de fichiers disponibles pour le processus, ou tous sauf un, sont actuellement ouverts.
ENFILE Le nombre de fichiers ouverts simultanément dans le système dépasserait la limite imposée par le système.

Exemple

L'exemple suivant illustre l'utilisation d'un tube pour transférer des données entre un processus parent et un processus enfant. La gestion des erreurs est exclue, mais ce code illustre les bonnes pratiques d'utilisation des tubes : après le fork(), les deux processus ferment les extrémités inutilisées du tube avant de commencer le transfert de données :

  1. #include <stdlib.h>
  2. #include <unistd.h>
  3. ...
  4.  
  5.  
  6. int fildes[2];
  7. const int BSIZE = 100;
  8. char buf[BSIZE];
  9. ssize_t nbytes;
  10. int status;
  11.  
  12.  
  13. status = pipe(fildes);
  14. if (status == -1 ) {
  15.     /* une erreur s'est produite */
  16.     ...
  17. }
  18.  
  19.  
  20. switch (fork()) {
  21. case -1: /* Erreur de gestion */
  22.     break;
  23.  
  24.  
  25. case 0:  /* Enfant - lit à partir du tuyau */
  26.     close(fildes[1]);                            /* La fin d'écriture n'est pas utilisée */
  27.     nbytes = read(fildes[0], buf, BSIZE);        /* Obtenir des données à partir du tuyau */
  28.     /* À ce stade, une lecture plus approfondie verrait la fin du fichier... */
  29.     close(fildes[0]);                            /* Fini avec un tuyau */
  30.     exit(EXIT_SUCCESS);
  31.  
  32.  
  33. default:  /* Parent - écrit dans le tuyau */
  34.     close(fildes[0]);                            /* La fin de lecture n'est pas utilisée */
  35.     write(fildes[1], "Bonjour le monde\n", 12);  /* Écrire des données sur un tuyau */
  36.     close(fildes[1]);                            /* L'enfant verra EOF */
  37.     exit(EXIT_SUCCESS);
  38. }

Voir également

fcntl, read, write


Dernière mise à jour : Vendredi, le 5 Juin 2020