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
- La fonction pipe() crée un tube et place deux descripteurs de fichiers, un dans les paramètres fildes[0] et fildes[1], faisant référence aux descriptions de fichiers ouverts pour les extrémités lecture et écriture du tube. Les descripteurs de fichiers sont alloués comme décrit dans la section Allocation des descripteurs de fichiers. Les indicateurs O_NONBLOCK et FD_CLOEXEC doivent être désactivés sur les deux descripteurs de fichiers. (La fonction fcntl() permet de définir ces deux indicateurs.)
- Les données peuvent être écrites dans le descripteur de fichier fildes[1] et lues depuis le descripteur de fichier fildes[0]. Une lecture sur le descripteur de fichier fildes[0] accède aux données écrites dans le descripteur de fichier fildes[1] selon le principe du premier entré, premier sorti. Il n'est pas précisé si fildes[0] est également ouvert en écriture et si fildes[1] est également ouvert en lecture.
- Un processus ouvre le tube en lecture (et donc en écriture) si un descripteur de fichier ouvert fait référence à l'extrémité de lecture, fildes[0] (extrémité d'écriture, fildes[1]).
- L'ID utilisateur du tube doit être défini sur l'ID utilisateur effectif du processus appelant.
- L'ID de groupe du tube doit être défini sur l'ID de groupe effectif du processus appelant.
- Une fois l'opération terminée, pipe() marque pour mise à jour les horodatages du dernier accès aux données, de la dernière modification des données et du dernier changement d'état du fichier du tube.
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 :
- #include <stdlib.h>
- #include <unistd.h>
- ...
-
-
- int fildes[2];
- const int BSIZE = 100;
- char buf[BSIZE];
- ssize_t nbytes;
- int status;
-
-
- status = pipe(fildes);
- if (status == -1 ) {
- /* une erreur s'est produite */
- ...
- }
-
-
- switch (fork()) {
- case -1: /* Erreur de gestion */
- break;
-
-
- case 0: /* Enfant - lit à partir du tuyau */
- close(fildes[1]); /* La fin d'écriture n'est pas utilisée */
- nbytes = read(fildes[0], buf, BSIZE); /* Obtenir des données à partir du tuyau */
- /* À ce stade, une lecture plus approfondie verrait la fin du fichier... */
- close(fildes[0]); /* Fini avec un tuyau */
- exit(EXIT_SUCCESS);
-
-
- default: /* Parent - écrit dans le tuyau */
- close(fildes[0]); /* La fin de lecture n'est pas utilisée */
- write(fildes[1], "Bonjour le monde\n", 12); /* Écrire des données sur un tuyau */
- close(fildes[1]); /* L'enfant verra EOF */
- exit(EXIT_SUCCESS);
- }
Voir également
Dernière mise à jour : Vendredi, le 5 Juin 2020