Alt om rør () Funksjon:
Syntaksen til rør() funksjonen er:
int pipe (int pipefd [2]);Her oppretter rør () -funksjonen en ensrettet datakanal for kommunikasjon mellom prosesser. Du passerer i en int (Heltall) type matrise pipefd bestående av 2 matriseelement til funksjonsrøret (). Deretter lager pipen () to filbeskrivelser i pipefd array.
Det første elementet i pipefd array, pipefd [0] brukes til å lese data fra røret.
Det andre elementet i pipefd array, pipefd [1] brukes til å skrive data til røret.
Når det lykkes, returnerer pipen () -funksjonen 0. Hvis det oppstår en feil under initialisering av rør, returnerer rør () -funksjonen -1.
Pipe () -funksjonen er definert i overskriften unistd.h. For å kunne bruke pipe () -funksjonen i C-programmet ditt, må du inkludere toppteksten unistd.h som følger:
#inkludereFor mer informasjon om rørfunksjonen (), sjekk manens side av rør () med følgende kommando:
$ mann 2 rørMannsiden av rør ().
Eksempel 1:
For det første eksemplet, opprett en ny C-kildefil 1_rør.c og skriv inn følgende kodelinjer.
#inkludere#inkludere
#inkludere
int main (ugyldig)
int pipefds [2];
hvis (pipe (pipefds) == -1)
perror ("pipe");
Avslutt (EXIT_FAILURE);
printf ("Les filbeskrivelsesverdi:% d \ n", pipefds [0]);
printf ("Skriv filbeskrivelsesverdi:% d \ n", pipefds [1]);
returner EXIT_SUCCESS;
Her inkluderte jeg toppfilen av pipe () unistd.h først med følgende linje.
#inkludereSå, i hoved() funksjon definerte jeg pipefds to-element heltall matrise med følgende linje.
int pipefds [2];Deretter kjørte jeg pipen () -funksjonen for å initialisere filbeskrivelsesmatrisen pipefds som følger.
rør (pipefds)Jeg har også sjekket for feil ved bruk av returverdien til rørfunksjonen (). Jeg brukte exit() funksjon for å avslutte programmet i tilfelle rørfunksjonen mislykkes.
hvis (pipe (pipefds) == -1)perror ("pipe");
Avslutt (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 utdata. Som du kan se, verdien av den leste rørfilbeskrivelsen pipefds [0] er 3 og skriv pipefilbeskrivelse pipefds [1] er 4.
Eksempel 2:
Opprett en annen C-kildefil 2_rør.c og skriv inn følgende kodelinjer.
#inkludere#inkludere
#inkludere
#inkludere
int main (ugyldig)
int pipefds [2];
røyebuffer [5];
hvis (pipe (pipefds) == -1)
perror ("pipe");
Avslutt (EXIT_FAILURE);
char * pin = "4128 \ 0";
printf ("Skriver PIN til rør ... \ n");
skriv (pipefds [1], pin, 5);
printf ("Ferdig.\ n \ n ");
printf ("Lese PIN fra rør ... \ n");
lese (pipefds [0], buffer, 5);
printf ("Ferdig.\ n \ n ");
printf ("PIN fra rør:% s \ n", buffer);
returner EXIT_SUCCESS;
Dette programmet viser i utgangspunktet hvordan du skriver til røret og leser dataene du har skrevet fra røret.
Her lagret jeg en 4-tegns PIN-kode i en røye array. Lengden på matrisen er 5 (inkludert NULL-tegnet \ 0).
char * pin = "4128 \ 0";Hvert ASCII-tegn er 1 byte i størrelse i C. 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 data (pin) inn i røret, brukte jeg skrive() funksjon ved å bruke skrivebeskrivelsen pipefds [1] som følger.
skriv (pipefds [1], pin, 5);Nå som jeg har noen data i røret, kan jeg lese det fra røret ved hjelp av lese() funksjon på den leste rørfilbeskrivelsen pipefds [0]. Som jeg har skrevet 5 byte data (pin) inn i røret, vil jeg også lese 5 byte med data fra røret. Dataene som blir lest vil bli lagret i buffer tegnsett. Som jeg skal lese 5 byte med data fra røret, vil buffer tegnmatrisen må være minst 5 byte lang.
Jeg har definert buffer tegnrute 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 ser.
Eksempel 3:
Opprett en ny C-kildefil 3_rør.c som skriv inn følgende kodelinjer.
#inkludere#inkludere
#inkludere
#inkludere
#inkludere
int main (ugyldig)
int pipefds [2];
røye * pin;
røyebuffer [5];
hvis (pipe (pipefds) == -1)
perror ("pipe");
Avslutt (EXIT_FAILURE);
pid_t pid = gaffel ();
if (pid == 0) // i underordnet prosess
pin = "4821 \ 0"; // PIN å sende
lukk (pipefds [0]); // lukk les fd
skriv (pipefds [1], pin, 5); // skriv PIN til rør
printf ("Genererer PIN i barnet og sender til foreldrene ... \ n");
søvn (2); // forsettlig forsinkelse
Avslutt (EXIT_SUCCESS);
hvis (pid> 0) // i hovedprosessen
vent (NULL); // vent til barneprosessen er ferdig
lukk (pipefds [1]); // lukk skriv fd
lese (pipefds [0], buffer, 5); // les PIN fra rør
lukk (pipefds [0]); // lukk les fd
printf ("Forelder mottatt PIN '% s' \ n", buffer);
returner EXIT_SUCCESS;
I dette eksemplet viste jeg deg hvordan du bruker rør til kommunikasjon mellom prosesser. Jeg har sendt en PIN-kode fra barneprosessen til foreldreprosessen ved hjelp av et rør. Les deretter PIN-koden fra røret i foreldreprosessen og skrev den ut fra foreldreprosessen.
Først har jeg laget en barneprosess ved hjelp av fork () -funksjonen.
pid_t pid = gaffel ();Så, i barneprosessen (pid == 0), Skrev jeg PIN-koden til røret ved hjelp av skrive() funksjon.
skriv (pipefds [1], pin, 5);Når PIN-koden er skrevet til røret fra barneprosessen, blir foreldreprosessen (pid> 0) les den fra røret ved hjelp av lese() funksjon.
lese (pipefds [0], buffer, 5);Deretter skrev foreldreprosessen ut PIN-koden ved hjelp av printf () fungere som vanlig.
printf ("Forelder mottatt PIN '% s' \ n", buffer);Som du kan se, kjører programmet det forventede resultatet.
Eksempel 4:
Opprett en ny C-kildefil 4_rør.c skriv inn følgende kodelinjer.
#inkludere#inkludere
#inkludere
#inkludere
#inkludere
#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2
ugyldig getPIN (char pin [PIN_LENGTH + 1])
srand (getpid () + getppid ());
pin [0] = 49 + rand ()% 7;
for (int i = 1; i < PIN_LENGTH; i++)
pin [i] = 48 + rand ()% 7;
pin [PIN_LENGTH] = '\ 0';
int main (ugyldig)
mens (1)
int pipefds [2];
char pin [PIN_LENGTH + 1];
char buffer [PIN_LENGTH + 1];
pipe (pipefds);
pid_t pid = gaffel ();
hvis (pid == 0)
getPIN (pin); // generere PIN
lukk (pipefds [0]); // lukk les fd
skriv (pipefds [1], pin, PIN_LENGTH + 1); // skriv PIN til rør
printf ("Genererer PIN i barnet og sender til foreldrene ... \ n");
sove (PIN_WAIT_INTERVAL); // forsinker generering av PIN med vilje.
Avslutt (EXIT_SUCCESS);
hvis (pid> 0)
vent (NULL); // venter på at barnet skal bli ferdig
lukk (pipefds [1]); // lukk skriv fd
lese (pipefds [0], buffer, PIN_LENGTH + 1); // les PIN fra rør
lukk (pipefds [0]); // lukk les fd
printf ("Foreldre mottok PIN '% s' fra barnet.\ n \ n ", buffer);
returner EXIT_SUCCESS;
Dette eksemplet er det samme som Eksempel 3. Den eneste forskjellen er at dette programmet kontinuerlig oppretter en underordnet prosess, genererer en PIN-kode i barneprosessen og sender PIN-koden til foreldreprosessen 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 ser, fungerer programmet som forventet.
Du kan bare stoppe programmet ved å trykke på
Så dette er hvordan du bruker pipe () systemanropet i C programmeringsspråk. Takk for at du leser denne artikkelen.