Comment utiliser la fonction de tuyau dans le langage C

Comment utiliser la fonction de tuyau dans le langage C

Un tuyau est un moyen de communication entre les processus. Un processus écrit des données sur le tuyau, et un autre processus lit les données du tuyau. Dans cet article, nous verrons comment la fonction Pipe () est utilisée pour implémenter le concept en utilisant le langage C.

À propos de la pipe

Dans le tuyau, les données sont maintenues dans un ordre FIFO, ce qui signifie écrire des données à une extrémité du tuyau séquentiellement et lire les données d'une autre extrémité du tuyau dans le même ordre séquentiel.

Si un processus se lit sur le tuyau, mais aucun autre processus n'a encore écrit au tuy. Si un processus veut écrire sur un tuyau, mais qu'il n'y a pas d'autre processus attaché au tuyau pour la lecture, alors il s'agit d'une condition d'erreur et que le tuyau génère un signal SigPipe.

En tête de fichier

#inclure

Syntaxe

INT PIPE (INT Filedes [2])

Arguments

Cette fonction prend un seul argument, un tableau de deux entiers (licenciés). Filed [0] est utilisé pour lire le tuyau, et Filed [1] est utilisé pour écrire sur le tuyau. Le processus qui veut lire le tuyau devrait fermer Filed [1], Et le processus qui veut écrire au tuyau devrait fermer Filed [0]. Si les extrémités inutiles du tuyau ne sont pas explicitement fermées, alors la fin de fichier (EOF) ne sera jamais retournée.

Valeurs de retour

Sur le succès, le tuyau() Renvoie 0, pour l'échec, la fonction renvoie -1.

Pictorialement, nous pouvons représenter le tuyau() fonction comme suit:

Vous trouverez ci-dessous quelques exemples illustrant comment utiliser la fonction de tuyau dans le langage C.

Exemple 1

Dans cet exemple, nous verrons comment fonctionne la fonction de tuyau. Bien que l'utilisation d'un tuyau en un seul processus ne soit pas très utile, mais nous aurons une idée.

// Exemple 1.c
#inclure
#inclure
#inclure
#inclure
int main()

int n;
Int Filedes [2];
tampon char [1025];
char * message = "Bonjour, monde!"
tuyau (fichiers);
écrire (filedes [1], message, strlen (message));
if ((n = read (filedes [0], tampon, 1024))> = 0)
tampon [n] = 0; // terminer la chaîne
printf ("lire% d octets du tuyau:"% s "\ n", n, tampon);

autre
Perror ("lire");
sortie (0);

Ici, nous avons d'abord créé un tuyau en utilisant tuyau() fonction puis écrit au tuyau en utilisant fildes [1] fin. Ensuite, les données ont été lues en utilisant l'autre extrémité du tuyau, qui est Filed [0]. Pour lire et écrire dans le fichier, nous avions l'habitude de lire() et écrire() les fonctions.

Exemple2

Dans cet exemple, nous verrons comment les processus parents et enfants communiquent en utilisant le tuyau.

// Exemple2.c
#inclure
#inclure
#inclure
#inclure
#inclure
int main()

Int Filedes [2], Nbytes;
pid_t childpid;
Char String [] = "Hello, monde!\ n ";
Char Readbuffer [80];
tuyau (fichiers);
if ((childpid = fork ()) == -1)

Perror ("Fork");
sortie (1);

if (ChildPid == 0)

Fermer (Filedes [0]); // Le processus enfant n'a pas besoin de cette fin du tuyau
/ * Envoyer "String" via le côté de sortie du tuyau * /
write (filedes [1], String, (strlen (string) +1));
sortie (0);

autre

/ * Le processus parent ferme le côté de sortie du tuyau * /
Fermer (Filedes [1]); // Le processus parent n'a pas besoin de cette fin du tuyau
/ * Lire dans une chaîne du tuyau * /
nbytes = read (filedes [0], readbuffer, sizeof (readbuffer));
printf ("lire la chaîne:% s", readbuffer);

return (0);

Tout d'abord, un tuyau a été créé à l'aide de la fonction de tuyau, puis un processus d'enfant a été fourchu. Ensuite, le processus de l'enfant ferme l'extrémité de lecture et écrit au tuyau. Le processus parent ferme la fin de l'écriture et lit le tuyau et l'affiche. Ici, le flux de données n'est qu'une façon dont de l'enfant au parent.

Conclusion:

tuyau() est un puissant appel système dans Linux. Dans cet article, nous n'avons vu qu'un flux de données unidirectionnel, un processus écrit et un autre processus lit, créant deux tuyaux que nous pouvons également réaliser le flux de données bidirectionnel.