Hvordan bruke rørfunksjon på C -språk

How Use Pipe Function C Language



Et rør er et medium for kommunikasjon mellom prosesser. En prosess skriver data til røret, og en annen prosess leser dataene fra røret. I denne artikkelen vil vi se hvordan pipe () -funksjonen brukes til å implementere konseptet ved hjelp av C -språk.

Om Pipe

I røret opprettholdes dataene i en FIFO -rekkefølge, noe som betyr å skrive data til den ene enden av røret sekvensielt og lese data fra en annen ende av røret i samme sekvensielle rekkefølge.







Hvis noen prosess leser fra røret, men ingen annen prosess ikke har skrevet til røret ennå, returnerer les slutten av filen. Hvis en prosess ønsker å skrive til et rør, men det ikke er noen annen prosess festet til røret for lesing, er dette en feiltilstand, og røret genererer et SIGPIPE -signal.



Header File

#inkludere

Syntaks



intrør(intfiledes[2])

Argumenter

Denne funksjonen tar et enkelt argument, en rekke med to heltall ( filedes ). filedes [0] brukes til avlesning fra røret, og filedes [1] brukes til å skrive til røret. Prosessen som ønsker å lese fra røret, bør lukkes filedes [1], og prosessen som vil skrive til røret, bør lukkes filedes [0] . Hvis unødvendige ender av røret ikke eksplisitt er lukket, vil slutten av filen (EOF) aldri bli returnert.





Returner verdier

På suksess, rør() returnerer 0, for feil returnerer funksjonen -1.

Piktorisk kan vi representere rør() fungerer som følger:



Nedenfor er noen eksempler som viser hvordan du bruker rørfunksjonen på C -språk.

Eksempel 1

I dette eksemplet vil vi se hvordan rørfunksjonen fungerer. Selv om bruk av et rør i en enkelt prosess ikke er veldig nyttig, men vi får en ide.

// Eksempel1.c
#inkludere
#inkludere
#inkludere
#inkludere

inthoved-()
{
intn;
intfiledes[2];
røyebuffer[1025];
røye *beskjed= 'Hei Verden!';

rør(filedes);
skrive(filedes[1],beskjed, strlen (beskjed));

hvis ((n=lese(filedes[0],buffer, 1024 ) ) > = 0) {
buffer[n] = 0; // avslutt strengen
printf ('les %d byte fra røret:'%s' n',n,buffer);
}
ellers
perror ('lese');
exit (0);
}

Her har vi først laget et rør ved hjelp av rør() funksjon deretter skrevet til røret ved hjelp av elfenben [1] slutt. Deretter har dataene blitt lest ved hjelp av den andre enden av røret, som er filedes [0] . For å lese og skrive til filen, pleide vi å lese() og skrive() funksjoner.

Eksempel 2

I dette eksemplet vil vi se hvordan foreldre og barn prosesser kommuniserer ved hjelp av røret.

// Eksempel2.c
#inkludere
#inkludere
#inkludere
#inkludere
#inkludere

inthoved-()
{
intfiledes[2],nbytes;
pid_t childpid;
røyestreng[] = 'Hei Verden! n';
røyereadbuffer[80];

rør(filedes);

hvis((barnebarn=gaffel()) == -1)
{
perror ('gaffel');
exit (1);
}

hvis(barnebarn== 0)
{
Lukk(filedes[0]);// Barneprosess trenger ikke denne enden av røret

/ * Send 'streng' gjennom utgangssiden av røret */
skrive(filedes[1],streng, ( strlen (streng)+1));
exit (0);
}
ellers
{
/ * Overordnet prosess lukker utgangssiden av røret */
Lukk(filedes[1]);// Foreldreprosess trenger ikke denne enden av røret

/ * Les i en streng fra røret */
nbytes=lese(filedes[0],readbuffer, størrelsen av(readbuffer));
printf ('Les streng: %s',readbuffer);
}

komme tilbake(0);
}

Først har ett rør blitt opprettet ved hjelp av rørfunksjon, deretter har en barneprosess blitt forked. Deretter lukker barneprosessen leseenden og skriver til røret. Den overordnede prosessen lukker skriveenden og leser fra røret og viser den. Her er dataflyten bare en måte som er fra barn til forelder.

Konklusjon:

rør() er et kraftig systemanrop i Linux. I denne artikkelen har vi bare sett enveis dataflyt, en prosess skriver og en annen prosess leser, og skaper to rør som vi også kan oppnå toveis dataflyt.