Rørsystemanrop i C

Pipe System Call C



rør() er en Linux -systemfunksjon. De rør() systemfunksjon brukes til å åpne filbeskrivelser, som brukes til å kommunisere mellom forskjellige Linux -prosesser. Kort sagt, rør() funksjonen brukes til kommunikasjon mellom prosesser i Linux. I denne artikkelen skal jeg vise deg hvordan du bruker pipe () systemfunksjonen i Linux. Så, la oss komme i gang.

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ør
Mannens 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.

#inkludere

Deretter, 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.