Com s'utilitza la funció de canonada en llenguatge C.

How Use Pipe Function C Language



Una canonada és un mitjà de comunicació entre processos. Un procés escriu dades a la canonada i un altre procés llegeix les dades de la canonada. En aquest article, veurem com s’utilitza la funció pipe () per implementar el concepte amb llenguatge C.

Quant a Pipe

A la canonada, les dades es mantenen en un ordre FIFO, que significa escriure dades a un extrem de la canonada i llegir dades d’un altre extrem de la canonada en el mateix ordre seqüencial.







Si algun procés es llegeix des de la canonada, però encara no hi ha cap altre procés que s'hagi escrit a la canonada, la lectura torna al final del fitxer. Si un procés vol escriure a una canonada, però no hi ha cap altre procés connectat a la canonada per llegir-lo, es tracta d’una condició d’error i la canonada genera un senyal SIGPIPE.



Fitxer de capçalera

#incloure

Sintaxi



intcanonada(intfiledes[2])

Arguments

Aquesta funció pren un únic argument, una matriu de dos enters ( filedes ). filedes [0] s'utilitza per llegir des de la canonada i filedes [1] s’utilitza per escriure a la canonada. El procés que es vulgui llegir de la canonada hauria de tancar-se filedes [1], i el procés que vol escriure a la canonada hauria de tancar-se filedes [0] . Si els extrems innecessaris de la canonada no es tanquen explícitament, el final del fitxer (EOF) mai no es retornarà.





Retorna els valors

En cas d 'èxit, el pipa () retorna 0, en cas d'error, la funció retorna -1.

Pictòricament, podem representar el pipa () funciona de la següent manera:



A continuació es mostren alguns exemples que mostren com utilitzar la funció de canonada en llenguatge C.

Exemple 1

En aquest exemple, veurem com funciona la funció de canonada. Tot i que l’ús d’una canonada en un sol procés no és molt útil, però ens farem una idea.

// Exemple1.c
#incloure
#incloure
#incloure
#incloure

intprincipal()
{
intn;
intfiledes[2];
charmemòria intermèdia[1025];
char *missatge= 'Hola món!';

canonada(filedes);
escriure(filedes[1],missatge, strlen (missatge));

si ((n=llegir(filedes[0],memòria intermèdia, 1024 ) ) > = 0) {
memòria intermèdia[n] = 0; // finalitzar la cadena
printf ('llegeix% d bytes de la canonada:'%s' n',n,memòria intermèdia);
}
en cas contrari
perror ('llegir');
sortir (0);
}

Aquí hem creat primer un tub mitjançant pipa () després s'escriu a la canonada mitjançant marfil [1] final. Després, les dades s’han llegit amb l’altre extrem de la canonada, que és filedes [0] . Solíem llegir i escriure al fitxer llegir () i write () funcions.

Exemple2

En aquest exemple, veurem com es comuniquen els processos pares i fills mitjançant la canalització.

// Exemple2.c
#incloure
#incloure
#incloure
#incloure
#incloure

intprincipal()
{
intfiledes[2],nbytes;
pid_t childpid;
charcorda[] = 'Hola món! n';
charreadbuffer[80];

canonada(filedes);

si((infantil=forquilla()) == -1)
{
perror ('forquilla');
sortir (1);
}

si(infantil== 0)
{
Tanca(filedes[0]);// El procés fill no necessita aquest extrem de la canonada

/ * Envia 'string' pel costat de sortida del tub * /
escriure(filedes[1],corda, ( strlen (corda)+1));
sortir (0);
}
en cas contrari
{
/ * El procés principal tanca el costat de sortida del tub * /
Tanca(filedes[1]);// El procés pare no necessita aquest extrem de la canonada

/ * Llegiu una cadena des de la canonada * /
nbytes=llegir(filedes[0],readbuffer, mida de(readbuffer));
printf ('Llegeix la cadena:% s',readbuffer);
}

tornar(0);
}

En primer lloc, s'ha creat una canonada utilitzant la funció de canonada i després s'ha forcat un procés fill. Després, el procés fill tanca el final de lectura i escriu a la canonada. El procés pare tanca l'extrem d'escriptura i llegeix des de la canonada i el mostra. En aquest cas, el flux de dades és només una manera que és des del fill fins al pare.

Conclusió:

pipa () és una potent trucada del sistema a Linux. En aquest article, només hem vist un flux de dades unidireccional, un procés escriu i un altre procés llegeix, creant dues canonades, també podem aconseguir un flux de dades bidireccional.