Sådan bruges rørfunktion på C -sprog

How Use Pipe Function C Language



Et rør er et medium til kommunikation mellem processer. En proces skriver data til røret, og en anden proces læser data fra røret. I denne artikel vil vi se, hvordan funktionen pipe () bruges til at implementere konceptet ved hjælp af C -sprog.

Om Pipe

I røret opretholdes dataene i en FIFO -rækkefølge, hvilket betyder at skrive data til den ene ende af røret sekventielt og læse data fra en anden ende af røret i samme rækkefølge.







Hvis en proces læser fra røret, men ingen anden proces ikke har skrevet til røret endnu, returnerer læsning slut-af-fil. Hvis en proces vil skrive til et rør, men der ikke er knyttet en anden proces til røret til aflæsning, er dette en fejltilstand, og røret genererer et SIGPIPE -signal.



Overskriftsfil

#omfatte

Syntaks



intrør(intfiledes[2])

Argumenter

Denne funktion tager et enkelt argument, en matrix med to heltal ( filedes ). filedes [0] bruges til aflæsning fra røret, og filedes [1] bruges til at skrive til røret. Processen, der ønsker at læse fra røret, skal lukke filedes [1], og den proces, der vil skrive til røret, skal lukke filedes [0] . Hvis de unødvendige ender af røret ikke eksplicit lukkes, returneres end-of-file (EOF) aldrig.





Returværdier

På succes, den rør() returnerer 0, for fejl returnerer funktionen -1.

Billedmæssigt kan vi repræsentere rør() fungerer som følger:



Nedenfor er et par eksempler, der viser, hvordan du bruger rørfunktionen på C -sprog.

Eksempel 1

I dette eksempel vil vi se, hvordan rørfunktionen fungerer. Selvom brug af et rør i en enkelt proces ikke er særlig nyttigt, men vi får en idé.

// Eksempel1.c
#omfatte
#omfatte
#omfatte
#omfatte

intvigtigste()
{
intn;
intfiledes[2];
forkælelsebuffer[1025];
forkælelse *besked= 'Hej Verden!';

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

hvis ((n=Læs(filedes[0],buffer, 1024 ) ) > = 0) {
buffer[n] = 0; // afslut strengen
printf ('læs %d bytes fra røret:'%s' n',n,buffer);
}
andet
perror ('Læs');
Afslut (0);
}

Her har vi først oprettet et rør ved hjælp af rør() funktion derefter skrevet til røret ved hjælp af elfenben [1] ende. Derefter er dataene blevet læst ved hjælp af den anden ende af røret, dvs. filedes [0] . For at læse og skrive til filen plejede vi at Læs() og skrive() funktioner.

Eksempel 2

I dette eksempel vil vi se, hvordan forælder- og barneprocesser kommunikerer ved hjælp af røret.

// Eksempel2.c
#omfatte
#omfatte
#omfatte
#omfatte
#omfatte

intvigtigste()
{
intfiledes[2],nbytes;
pid_t barnepid;
forkælelsesnor[] = 'Hej Verden! n';
forkælelselæsebuffer[80];

rør(filedes);

hvis((barnepid=gaffel()) == -1)
{
perror ('gaffel');
Afslut (1);
}

hvis(barnebarn== 0)
{
tæt(filedes[0]);// Børneprocessen behøver ikke denne ende af røret

/ * Send 'streng' gennem udgangssiden af ​​røret */
skrive(filedes[1],snor, ( strlen (snor)+1));
Afslut (0);
}
andet
{
/ * Forældreprocessen lukker udgangssiden af ​​røret */
tæt(filedes[1]);// Forældreprocessen behøver ikke denne ende af røret

/ * Læs i en snor fra røret */
nbytes=Læs(filedes[0],læsebuffer, størrelse på(læsebuffer));
printf ('Læs streng: %s',læsebuffer);
}

Vend tilbage(0);
}

Først er et rør blevet oprettet ved hjælp af rørfunktion, derefter er en underordnet proces blevet forked. Derefter lukker barneprocessen den læste ende og skriver til røret. Forældreprocessen lukker skriveenden og læser fra røret og viser den. Her er dataflytning kun en måde, der er fra barn til forælder.

Konklusion:

rør() er et kraftfuldt systemopkald i Linux. I denne artikel har vi kun set envejs dataflyt, en proces skriver og en anden proces læser, hvilket skaber to rør, vi kan også opnå tovejs datastrøm.