Comment utiliser la fonction pipe en langage C

How Use Pipe Function C Language



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

À propos du tuyau

Dans le tube, les données sont conservées dans un ordre FIFO, ce qui signifie écrire les données à une extrémité du tube de manière séquentielle et lire les données à partir d'une autre extrémité du tube dans le même ordre séquentiel.







Si un processus lit à partir du tube, mais qu'aucun autre processus n'a encore écrit dans le tube, read renvoie la fin du fichier. Si un processus veut écrire dans un tube, mais qu'il n'y a pas d'autre processus attaché au tube pour la lecture, alors il s'agit d'une condition d'erreur et le tube génère un signal SIGPIPE.



En tête de fichier

#comprendre

Syntaxe



entiertuyau(entierfichiers[2])

Arguments

Cette fonction prend un seul argument, un tableau de deux entiers ( fichiers ). fichiers[0] est utilisé pour la lecture du tuyau, et classées[1] est utilisé pour écrire dans le tube. Le processus qui veut lire à partir du tuyau doit se fermer classées[1], et le processus qui veut écrire dans le tube devrait se fermer fichiers[0] . Si les extrémités inutiles du tube ne sont pas explicitement fermées, la fin de fichier (EOF) ne sera jamais renvoyée.





Valeurs de retour

En cas de succès, le tuyau() renvoie 0, en cas d'échec la fonction renvoie -1.

Picturalement, on peut représenter le tuyau() fonctionner comme suit :



Vous trouverez ci-dessous quelques exemples illustrant comment utiliser la fonction pipe en langage C.

Exemple 1

Dans cet exemple, nous allons voir comment fonctionne la fonction pipe. Bien que l'utilisation d'un tuyau dans un seul processus ne soit pas très utile, nous allons nous faire une idée.

// Exemple1.c
#comprendre
#comprendre
#comprendre
#comprendre

entierprincipale()
{
entierm;
entierfichiers[2];
carboniseramortir[1025];
carboniser *un message= 'Bonjour le monde!';

tuyau(fichiers);
écrivez(fichiers[1],un message, stren (un message));

si ((m=lire(fichiers[0],amortir, 1024 ) ) > = 0) {
amortir[m] = 0; //termine la chaîne
imprimer ('lire %d octets depuis le tube : '%s' ',m,amortir);
}
autre
erreur ('lire');
sortir (0);
}

Ici, nous avons d'abord créé un tuyau en utilisant tuyau() fonction puis écrite dans le tuyau en utilisant ivoire [1] finir. Ensuite, les données ont été lues à l'aide de l'autre extrémité du tuyau, qui est fichiers[0] . Pour lire et écrire dans le fichier, nous avions l'habitude de lire() et écrivez() les fonctions.

Exemple2

Dans cet exemple, nous verrons comment les processus parents et enfants communiquent à l'aide du canal.

// Exemple2.c
#comprendre
#comprendre
#comprendre
#comprendre
#comprendre

entierprincipale()
{
entierfichiers[2],noctets;
pid_t childpid;
carboniserchaîne de caractères[] = 'Bonjour le monde! ';
carbonisertampon de lecture[80];

tuyau(fichiers);

si((enfant=fourchette()) == -1)
{
erreur ('fourchette');
sortir (1);
}

si(enfant== 0)
{
proche(fichiers[0]);//Le processus enfant n'a pas besoin de cette extrémité du tuyau

/* Envoie 'string' par le côté sortie du tube */
écrivez(fichiers[1],chaîne de caractères, ( stren (chaîne de caractères)+1));
sortir (0);
}
autre
{
/* Le processus parent ferme le côté sortie du tube */
proche(fichiers[1]);//Le processus parent n'a pas besoin de cette extrémité du tuyau

/* Lire une chaîne à partir du tube */
noctets=lire(fichiers[0],tampon de lecture, taille de(tampon de lecture));
imprimer ('Lire la chaîne : %s',tampon de lecture);
}

revenir(0);
}

Tout d'abord, un tube a été créé à l'aide de la fonction pipe, puis un processus enfant a été fork. Ensuite, le processus enfant ferme la fin de lecture et écrit dans le tube. Le processus parent ferme la fin d'écriture et lit à partir du tube et l'affiche. Ici, le flux de données n'est qu'à sens unique, de l'enfant au parent.

Conclusion:

tuyau() est un puissant appel système sous Linux. Dans cet article, nous n'avons vu qu'un flux de données unidirectionnel, un processus d'écriture et un autre processus de lecture, créant ainsi deux canaux, nous pouvons également obtenir un flux de données bidirectionnel.