Syntaksen til rør() funksjonen er:
intrør(intpipefd[2]);
Her lager pipe () -funksjonen en enveis datakanal for kommunikasjon mellom prosesser. Du passerer i en int (Heltall) type matrise pipefd bestående av 2 matriseelement til funksjonsrøret (). Deretter oppretter pipe () -funksjonen to filbeskrivelser i pipefd matrise.
Det første elementet i pipefd matrise, pipefd [0] brukes til å lese data fra røret.
Det andre elementet i pipefd matrise, pipefd [1] brukes til å skrive data til røret.
Etter suksess returnerer pipe () -funksjonen 0. Hvis det oppstår en feil under initialisering av rør, returnerer pipen () -funksjonen -1.
Funksjonen pipe () er definert i toppteksten unistd.h . For å bruke pipe () -funksjonen i C -programmet, må du inkludere headeren unistd.h følgende:
#inkludere
For mer informasjon om rørfunksjonen (), sjekk mannssiden til røret () med følgende kommando:
$ mann2rørMannens side av pipe().
Eksempel 1:
For det første eksemplet, opprett en ny C -kildefil 1_rør.c og skriv inn følgende koderader.
#inkludere#inkludere
#inkludere
inthoved-(tomrom) {
intpipefds[2];
hvis(rør(pipefds) == -1) {
perror ('rør');
exit (EXIT_FAILURE);
}
printf ('Les filbeskrivelsesverdi: %d n',pipefds[0]);
printf ('Skriv filbeskrivelsesverdi: %d n',pipefds[1]);
komme tilbakeEXIT_SUCCESS;
}
Her inkluderte jeg toppfilen til pipe () unistd.h først med følgende linje.
#inkludereDeretter, i hoved() funksjon, definerte jeg pipefds to -elementers heltallsserie med følgende linje.
intpipefds[2];Deretter kjørte jeg pipe () -funksjonen for å initialisere filbeskrivelsesmatrisen pipefds følgende.
rør(pipefds)Jeg har også sjekket for feil ved bruk av returverdien for funksjonen pipe (). Jeg brukte exit() funksjon for å avslutte programmet hvis rørfunksjonen mislykkes.
hvis(rør(pipefds) == -1) {perror ('rør');
exit (EXIT_FAILURE);
}
Deretter skrev jeg ut verdien av lese- og skrivepipefilbeskrivelsene pipefds [0] og pipefds [1] henholdsvis.
printf ('Les filbeskrivelsesverdi: %d n',pipefds[0]);printf ('Skriv filbeskrivelsesverdi: %d n',pipefds[1]);
Hvis du kjører programmet, bør du se følgende utgang. Som du kan se, er verdien av read pipe file descriptor pipefds [0] er 3 og skriv rørfilbeskrivelse pipefds [1] er 4 .
Eksempel 2:
Lag en annen C -kildefil 2_rør.c og skriv inn følgende koderader.
#inkludere#inkludere
#inkludere
#inkludere
inthoved-(tomrom) {
intpipefds[2];
røyebuffer[5];
hvis(rør(pipefds) == -1) {
perror ('rør');
exit (EXIT_FAILURE);
}
røye *pin= '4128 0';
printf ('Skriver PIN til rør ... n');
skrive(pipefds[1],pin, 5);
printf ('Ferdig. n n');
printf ('Leser PIN fra rør ... n');
lese(pipefds[0],buffer, 5);
printf ('Ferdig. n n');
printf ('PIN fra rør: %s n',buffer);
komme tilbakeEXIT_SUCCESS;
}
Dette programmet viser deg i utgangspunktet hvordan du skriver til røret og leser dataene du har skrevet fra røret.
Her lagret jeg en 4-tegn PIN-kode i en røye matrise. Lengden på matrisen er 5 (inkludert NULL -tegnet 0).
røye *pin= '4128 0';Hvert ASCII -tegn er 1 byte stort i C. Så for å sende den firesifrede PIN -koden gjennom røret, må du skrive 5 byte (4 + 1 NULL tegn) med data inn i røret.
For å skrive 5 byte med data ( pin ) inn i røret, brukte jeg skrive() funksjon ved å bruke skriverørfilbeskrivelsen pipefds [1] følgende.
skrive(pipefds[1],pin, 5);Nå som jeg har noen data i røret, kan jeg lese det fra røret ved hjelp av lese() funksjonen på read pipe -filbeskrivelsen pipefds [0] . Som jeg har skrevet 5 byte med data ( pin ) inn i røret, vil jeg også lese 5 byte data fra røret. Dataene som leses vil bli lagret i buffer tegnserie. Siden jeg skal lese 5 byte med data fra røret, vil buffer tegnserien må være minst 5 byte lang.
Jeg har definert buffer tegnserie i begynnelsen av hoved() funksjon.
røyebuffer[5];Nå kan jeg lese PIN -koden fra røret og lagre den i buffer matrise med følgende linje.
lese(pipefds[0],buffer, 5);Nå som jeg har lest PIN -koden fra røret, kan jeg skrive den ut med printf () fungere som vanlig.
printf ('PIN fra rør: %s n',buffer);Når jeg har kjørt programmet, vises riktig utgang som du kan se.
Eksempel 3:
Opprett en ny C -kildefil 3_rør.c som type i de følgende kodelinjene.
#inkludere#inkludere
#inkludere
#inkludere
#inkludere
inthoved-(tomrom) {
intpipefds[2];
røye *pin;
røyebuffer[5];
hvis(rør(pipefds) == -1) {
perror ('rør');
exit (EXIT_FAILURE);
}
pid_t pid=gaffel();
hvis(pid== 0) { // i barneprosess
pin= '4821 0'; // PIN -kode for å sende
Lukk(pipefds[0]); // Lukk lese fd
skrive(pipefds[1],pin, 5); // skriv PIN til rør
printf ('Genererer PIN -kode hos barn og sender til foreldre ... n');
søvn(2); // forsettlig forsinkelse
exit (EXIT_SUCCESS);
}
hvis(pid> 0) { // i hovedprosessen
vente(NULL); // vent på at barneprosessen er ferdig
Lukk(pipefds[1]); // Lukk skrive fd
lese(pipefds[0],buffer, 5); // les PIN fra rør
Lukk(pipefds[0]); // Lukk lese fd
printf ('Foreldre mottok PIN -kode'%s ' n',buffer);
}
komme tilbakeEXIT_SUCCESS;
}
I dette eksemplet viste jeg deg hvordan du bruker rør for kommunikasjon mellom prosesser. Jeg har sendt en PIN -kode fra barneprosessen til den overordnede prosessen ved hjelp av et rør. Les deretter PIN -koden fra røret i den overordnede prosessen og skriv den ut fra den overordnede prosessen.
Først har jeg opprettet en barneprosess ved hjelp av gaffel () -funksjonen.
pid_t pid=gaffel();Så, i barneprosessen ( pid == 0 ), Skrev jeg PIN -koden til røret ved hjelp av skrive() funksjon.
skrive(pipefds[1],pin, 5);Når PIN -koden er skrevet til røret fra barneprosessen, vil foreldreprosessen ( pid> 0 ) les den fra røret ved hjelp av lese() funksjon.
lese(pipefds[0],buffer, 5);Deretter skrev foreldreprosessen ut PIN -koden med printf () fungere som vanlig.
printf ('Foreldre mottok PIN -kode'%s ' n',buffer);Som du kan se, gir kjøring av programmet det forventede resultatet.
Eksempel 4:
Opprett en ny C -kildefil 4_rør.c som type i de følgende kodelinjene.
#inkludere#inkludere
#inkludere
#inkludere
#inkludere
#define PIN_LENGTH 4
#definere PIN_WAIT_INTERVAL 2
tomromgetPIN(røyepin[PIN_LENGTH+ 1]) {
srand (bli lei() +bli lei());
pin[0] = 49 + rad () % 7;
til(intJeg= 1;Jeg<PIN_LENGTH;Jeg++) {
pin[Jeg] = 48 + rad () % 7;
}
pin[PIN_LENGTH] = ' 0';
}
inthoved-(tomrom) {
samtidig som(1) {
intpipefds[2];
røyepin[PIN_LENGTH+ 1];
røyebuffer[PIN_LENGTH+ 1];
rør(pipefds);
pid_t pid=gaffel();
hvis(pid== 0) {
getPIN(pin); // generer PIN -kode
Lukk(pipefds[0]); // Lukk lese fd
skrive(pipefds[1],pin,PIN_LENGTH+ 1); // skriv PIN til rør
printf ('Genererer PIN -kode hos barn og sender til foreldre ... n');
søvn(PIN_WAIT_INTERVAL); // forsinket generering av PIN -koden med vilje.
exit (EXIT_SUCCESS);
}
hvis(pid> 0) {
vente(NULL); // venter på at barnet skal bli ferdig
Lukk(pipefds[1]); // Lukk skrive fd
lese(pipefds[0],buffer,PIN_LENGTH+ 1); // les PIN fra rør
Lukk(pipefds[0]); // Lukk lese fd
printf ('Foreldre mottok PIN'%s 'fra barnet. n n',buffer);
}
}
komme tilbakeEXIT_SUCCESS;
}
Dette eksemplet er det samme som Eksempel 3 . Den eneste forskjellen er at dette programmet kontinuerlig oppretter en barneprosess, genererer en PIN -kode i barneprosessen og sender PIN -koden til den overordnede prosessen ved hjelp av et rør.
Foreldreprosessen leser deretter PIN -koden fra røret og skriver den ut.
Dette programmet genererer en ny PIN_LENGTH PIN hver PIN_WAIT_INTERVAL sekund.
Som du kan se, fungerer programmet som forventet.
Du kan bare stoppe programmet ved å trykke på + C .
Så dette er hvordan du bruker pipe () systemanropet i programmeringsspråk C. Takk for at du leste denne artikkelen.