Syntaksen for rør() funktion er:
intrør(intpipefd[2]);
Her skaber funktionen pipe () en ensrettet datakanal til kommunikation mellem processer. Du passerer i en int (Heltal) type array pipefd bestående af 2 array -element til funktionsrøret (). Derefter opretter funktionen pipe () to filbeskrivelser i pipefd array.
Det første element i pipefd array, pipefd [0] bruges til at aflæse data fra røret.
Det andet element i pipefd array, pipefd [1] bruges til at skrive data til røret.
Efter succes returnerer funktionen pipe () 0. Hvis der opstår en fejl under initialisering af rør, returnerer funktionen pipe () -1.
Funktionen pipe () er defineret i overskriften unistd.h . For at bruge funktionen pipe () i dit C -program skal du inkludere headeren unistd.h som følger:
#omfatte
For mere information om rør () systemfunktionen, kontroller man -siden for rør () med følgende kommando:
$ mand2rørMandsiden af rør().
Eksempel 1:
For det første eksempel skal du oprette en ny C -kildefil 1_rør.c og indtast følgende kodelinjer.
#omfatte#omfatte
#omfatte
intvigtigste(ugyldig) {
intpipefds[2];
hvis(rør(pipefds) == -1) {
perror ('rør');
Afslut (EXIT_FAILURE);
}
printf ('Læs filbeskrivelsesværdi: %d n',pipefds[0]);
printf ('Skriv filbeskrivelsesværdi: %d n',pipefds[1]);
Vend tilbageEXIT_SUCCESS;
}
Her inkluderede jeg header -filen til pipe () unistd.h først med følgende linje.
#omfatteDerefter i main () funktion, definerede jeg pipefds toelementers heltal array med følgende linje.
intpipefds[2];Derefter kørte jeg pipe () -funktionen for at initialisere filbeskrivelsesmatrixen pipefds som følger.
rør(pipefds)Jeg kontrollerede også for fejl ved hjælp af returværdien af funktionen pipe (). Jeg brugte Afslut() funktion til at afslutte programmet, hvis rørfunktionen mislykkes.
hvis(rør(pipefds) == -1) {perror ('rør');
Afslut (EXIT_FAILURE);
}
Derefter udskriver jeg værdien af læse- og skrivepipe -filbeskrivere pipefds [0] og pipefds [1] henholdsvis.
printf ('Læs filbeskrivelsesværdi: %d n',pipefds[0]);printf ('Skriv filbeskrivelsesværdi: %d n',pipefds[1]);
Hvis du kører programmet, skal du se følgende output. Som du kan se, er værdien af read pipe file descriptor pipefds [0] er 3 og skriv rørfilbeskrivelse pipefds [1] er 4 .
Eksempel 2:
Opret en anden C -kildefil 2_rør.c og indtast følgende kodelinjer.
#omfatte#omfatte
#omfatte
#omfatte
intvigtigste(ugyldig) {
intpipefds[2];
forkælelsebuffer[5];
hvis(rør(pipefds) == -1) {
perror ('rør');
Afslut (EXIT_FAILURE);
}
forkælelse *pin= '4128 0';
printf ('Skrivning af pinkode til rør ... n');
skrive(pipefds[1],pin, 5);
printf ('Færdig. n n');
printf ('Læser pinkode fra rør ... n');
Læs(pipefds[0],buffer, 5);
printf ('Færdig. n n');
printf ('PIN fra rør: %s n',buffer);
Vend tilbageEXIT_SUCCESS;
}
Dette program viser dig dybest set, hvordan du skriver til røret og læser de data, du har skrevet fra røret.
Her gemte jeg en 4-tegn PIN-kode i en forkælelse array. Længden af arrayet er 5 (inklusive NULL -tegnet 0).
forkælelse *pin= '4128 0';Hvert ASCII -tegn er 1 byte i størrelse i C. Så for at sende den firecifrede PIN -kode gennem røret, skal du skrive 5 bytes (4 + 1 NULL -tegn) data i røret.
At skrive 5 bytes data ( pin ) ind i røret, brugte jeg skrive() funktion ved hjælp af skriverørfilbeskrivelsen pipefds [1] som følger.
skrive(pipefds[1],pin, 5);Nu hvor jeg har nogle data i røret, kan jeg læse det fra røret ved hjælp af Læs() funktion på read pipe -filbeskrivelsen pipefds [0] . Da jeg har skrevet 5 bytes data ( pin ) ind i røret, vil jeg også læse 5 bytes data fra røret. De læste data gemmes i buffer karakter array. Da jeg vil læse 5 bytes data fra røret, vil buffer tegnsæt skal være mindst 5 bytes langt.
Jeg har defineret buffer tegnsæt i begyndelsen af main () fungere.
forkælelsebuffer[5];Nu kan jeg læse PIN -koden fra røret og gemme den i buffer array med følgende linje.
Læs(pipefds[0],buffer, 5);Nu hvor jeg har læst PIN -koden fra røret, kan jeg udskrive den ved hjælp af printf () fungere som normalt.
printf ('PIN fra rør: %s n',buffer);Når jeg har kørt programmet, vises det korrekte output, som du kan se.
Eksempel 3:
Opret en ny C -kildefil 3_pipe.c som indtastning i følgende kodelinjer.
#omfatte#omfatte
#omfatte
#omfatte
#omfatte
intvigtigste(ugyldig) {
intpipefds[2];
forkælelse *pin;
forkælelsebuffer[5];
hvis(rør(pipefds) == -1) {
perror ('rør');
Afslut (EXIT_FAILURE);
}
pid_t pid=gaffel();
hvis(pid== 0) { // i barneproces
pin= '4821 0'; // PIN -kode til afsendelse
tæt(pipefds[0]); // tæt læs fd
skrive(pipefds[1],pin, 5); // skriv pinkode til rør
printf ('Genererer pinkode i barn og sender til forælder ... n');
søvn(2); // forsætlig forsinkelse
Afslut (EXIT_SUCCESS);
}
hvis(pid> 0) { // i hovedprocessen
vente(NUL); // vent på, at barneprocessen er færdig
tæt(pipefds[1]); // luk skrive fd
Læs(pipefds[0],buffer, 5); // læs pinkode fra rør
tæt(pipefds[0]); // tæt læs fd
printf ('Forælder modtog pinkode'%s ' n',buffer);
}
Vend tilbageEXIT_SUCCESS;
}
I dette eksempel viste jeg dig, hvordan du bruger rør til kommunikation mellem processer. Jeg har sendt en pinkode fra barneprocessen til forældreprocessen ved hjælp af et rør. Læs derefter PIN -koden fra røret i den overordnede proces og udskriv den fra den overordnede proces.
For det første har jeg oprettet en børneproces ved hjælp af gaffel () -funktionen.
pid_t pid=gaffel();I barneprocessen ( pid == 0 ), Skrev jeg PIN -koden til røret ved hjælp af skrive() fungere.
skrive(pipefds[1],pin, 5);Når PIN -koden er skrevet til røret fra barneprocessen, forælderprocessen ( pid> 0 ) læse det fra røret ved hjælp af Læs() fungere.
Læs(pipefds[0],buffer, 5);Derefter udskrev forældreprocessen pinkoden ved hjælp af printf () fungere som normalt.
printf ('Forælder modtog pinkode'%s ' n',buffer);Som du kan se, giver programmet et forventet resultat ved at køre programmet.
Eksempel 4:
Opret en ny C -kildefil 4_rør.c som indtastning i følgende kodelinjer.
#omfatte#omfatte
#omfatte
#omfatte
#omfatte
#define PIN_LENGTH 4
#definer PIN_WAIT_INTERVAL 2
ugyldiggetPIN(forkælelsepin[PIN_LENGTH+ 1]) {
srand (getpid() +blive ked af det());
pin[0] = 49 + række () % 7;
til(intjeg= 1;jeg<PIN_LENGTH;jeg++) {
pin[jeg] = 48 + række () % 7;
}
pin[PIN_LENGTH] = ' 0';
}
intvigtigste(ugyldig) {
mens(1) {
intpipefds[2];
forkælelsepin[PIN_LENGTH+ 1];
forkælelsebuffer[PIN_LENGTH+ 1];
rør(pipefds);
pid_t pid=gaffel();
hvis(pid== 0) {
getPIN(pin); // generer pinkode
tæt(pipefds[0]); // tæt læs fd
skrive(pipefds[1],pin,PIN_LENGTH+ 1); // skriv pinkode til rør
printf ('Genererer pinkode i barn og sender til forælder ... n');
søvn(PIN_WAIT_INTERVAL); // forsinket generering af pinkode med vilje.
Afslut (EXIT_SUCCESS);
}
hvis(pid> 0) {
vente(NUL); // venter på, at barnet er færdigt
tæt(pipefds[1]); // luk skrive fd
Læs(pipefds[0],buffer,PIN_LENGTH+ 1); // læs pinkode fra rør
tæt(pipefds[0]); // tæt læs fd
printf ('Forælder modtog pinkode'%s 'fra barn. n n',buffer);
}
}
Vend tilbageEXIT_SUCCESS;
}
Dette eksempel er det samme som Eksempel 3 . Den eneste forskel er, at dette program løbende opretter en børneproces, genererer en pinkode i barneprocessen og sender PIN -koden til den overordnede proces ved hjælp af et rør.
Forælderprocessen læser derefter PIN -koden fra røret og udskriver den.
Dette program genererer en ny PIN_LENGTH PIN hver PIN_WAIT_INTERVAL sekund.
Som du kan se, fungerer programmet som forventet.
Du kan kun stoppe programmet ved at trykke på + C .
Så dette er, hvordan du bruger pipe () systemopkaldet i C -programmeringssprog. Tak fordi du læste denne artikel.