C Programmering

Rørsystemanrop i C

Rørsystemanrop i C
rør() er en Linux-systemfunksjon. De rør() systemfunksjonen brukes til å åpne filbeskrivere, som brukes til å kommunisere mellom forskjellige Linux-prosesser. Kort sagt, den rør() funksjon 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.

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:

#inkludere

For mer informasjon om rørfunksjonen (), sjekk manens side av rør () med følgende kommando:

$ mann 2 rør
Mannsiden 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.

#inkludere

Så, 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å + C.

Så dette er hvordan du bruker pipe () systemanropet i C programmeringsspråk. Takk for at du leser denne artikkelen.

Shadow of the Tomb Raider for Linux Tutorial
Shadow of the Tomb Raider er det tolvte tilskuddet til Tomb Raider-serien - et action-eventyrspill-franchise opprettet av Eidos Montreal. Spillet ble ...
Hvordan øke FPS i Linux?
FPS står for Bilder per sekund. FPSs oppgave er å måle bildefrekvensen i videoavspilling eller spillprestasjoner. Med enkle ord betegnes antall uavbru...
Topp Oculus App Lab-spill
Hvis du er Oculus-hodesettinnehaver, må du være klar over sideloading. Sidelading er prosessen med å installere ikke-butikkinnhold på hodesettet. Side...