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 rør
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 nogen proces læser fra røret, men ingen anden proces ikke er skrevet til røret endnu, så læser returnerer slutningen af filen. Hvis en proces ønsker at skrive til et rør, men der ikke er nogen anden proces knyttet til røret til aflæsning, er dette en fejltilstand, og røret genererer et SIGPIPE-signal.
Sidehovedfil
#omfatteSyntaks
int pipe (int filedes [2])Argumenter
Denne funktion tager et enkelt argument, en matrix med to heltal (arkiverer). arkiverer [0] bruges til aflæsning fra røret, og arkiverer [1] bruges til at skrive til røret. Processen, der ønsker at læse fra røret, skal lukke arkiverer [1], og processen, der ønsker at skrive til røret, skal lukke arkiverer [0]. Hvis de unødvendige ender af røret ikke er eksplicit lukket, returneres end-of-file (EOF) aldrig.
Returner væ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 man bruger rørfunktionen på C-sprog.
Eksempel 1
I dette eksempel vil vi se, hvordan rørfunktionen fungerer. Selvom det ikke er meget nyttigt at bruge et rør i en enkelt proces, men vi får en idé.
// Eksempel1.c#omfatte
#omfatte
#omfatte
#omfatte
int main ()
int n;
int filedes [2];
char-buffer [1025];
char * message = "Hej verden!";
rør (filedes);
skriv (arkiverer [1], besked, strlen (besked));
hvis ((n = læst (arkiverer [0], buffer, 1024))> = 0)
buffer [n] = 0; // afslutte strengen
printf ("læs% d bytes fra røret:"% s "\ n", n, buffer);
andet
perror ("læs");
exit (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 filder [1] ende. Derefter er dataene læst ved hjælp af den anden ende af røret, hvilket er arkiverer [0]. Vi plejede at læse og skrive til filen Læs() og skrive() funktioner.
Eksempel 2
I dette eksempel vil vi se, hvordan forældre- og barnprocesser kommunikerer ved hjælp af røret.
// Eksempel2.c#omfatte
#omfatte
#omfatte
#omfatte
#omfatte
int main ()
int filedes [2], nbytes;
pid_t childpid;
char string [] = "Hej verden!\ n ";
char readbuffer [80];
rør (filedes);
hvis ((childpid = fork ()) == -1)
perror ("gaffel");
udgang (1);
hvis (childpid == 0)
close (filedes [0]); // Child-proces behøver ikke denne ende af røret
/ * Send "streng" gennem udgangssiden af røret * /
skriv (arkiverer [1], streng, (strlen (streng) +1));
exit (0);
andet
/ * Overordnet proces lukker udgangssiden af røret * /
close (filedes [1]); // Forældreprocessen behøver ikke denne ende af røret
/ * Læs i en streng fra røret * /
nbytes = read (filedes [0], readbuffer, sizeof (readbuffer));
printf ("Læs streng:% s", readbuffer);
retur (0);
Først er der oprettet et rør ved hjælp af rørfunktion, hvorefter en underordnet proces er blevet forked. Derefter lukker barneprocessen den læste ende og skriver til røret. Den overordnede proces lukker skriveenden og læser fra røret og viser den. Her er datastrøm kun en måde, der går fra barn til forælder.
Konklusion:
rør() er et kraftfuldt systemopkald i Linux. I denne artikel har vi kun set envejs datastrøm, en proces skriver, og en anden proces læser, hvilket skaber to rør, vi kan også opnå tovejs dataflytning.