Rørsystemanrop i C

Rørsystemanrop i 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, 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() funksjon er:

int pipe (int pipefd [2]);

Her oppretter Pipe () -funksjonen en ensrettet datakanal for kommunikasjon mellom prosessen. Du passerer i en int (Heltall) type matrise Pipefd bestående av 2 array -element til funksjonsrøret (). Deretter oppretter Pipe () -funksjonen 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.

Ved suksess returnerer Pipe () -funksjonen 0. Hvis det oppstår en feil under pipeinitialisering, returnerer Pipe () -funksjonen -1.

Pipe () -funksjonen er definert i overskriften Unistd.h. For å bruke Pipe () -funksjonen i C -programmet ditt, må du ta med overskriften Unistd.h følgende:

#inkludere

For mer informasjon om Pipe () Systemfunksjon, sjekk Man -siden til Pipe () med følgende kommando:

$ mann 2 rør
Mannens side av rør ().

Eksempel 1:

For det første eksemplet, oppretter du en ny C -kildefil 1_pipe.c og skriv inn følgende koderlinjer.

#inkludere
#inkludere
#inkludere
int main (void)
int pipefds [2];
if (pipe (pipefds) == -1)
Perror ("Pipe");
exit (exit_failure);

printf ("Les filbeskrivelsesverdi: %d \ n", pipefds [0]);
printf ("Skriv filbeskrivelsesverdi: %d \ n", pipefds [1]);
return exit_success;

Her inkluderte jeg toppfilen til Pipe () Unistd.h Først med følgende linje.

#inkludere

Da, i hoved() funksjon, jeg definerte Pipefds To element heltall med følgende linje.

int pipefds [2];

Deretter kjørte jeg Pipe () -funksjonen for å initialisere filbeskrivelsesarrayen Pipefds følgende.

rør (pipefds)

Jeg sjekket også for feil ved å bruke returverdien til Pipe () -funksjonen. Jeg brukte exit() funksjon for å terminal programmet i tilfelle rørfunksjonen mislykkes.

if (pipe (pipefds) == -1)
Perror ("Pipe");
exit (exit_failure);

Deretter trykket jeg verdien av lesings- 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 leserørfilbeskrivelsen pipefds [0] er 3 og skriv pipefilbeskrivelse PIPEFDS [1] er 4.

Eksempel 2:

Opprett en annen C -kildefil 2_pipe.c og skriv inn følgende koderlinjer.

#inkludere
#inkludere
#inkludere
#inkludere
int main (void)
int pipefds [2];
char buffer [5];
if (pipe (pipefds) == -1)
Perror ("Pipe");
exit (exit_failure);

char *pin = "4128 \ 0";
printf ("skrive pin til pipe ... \ n");
skriv (pipefds [1], pin, 5);
printf ("Ferdig.\ n \ n ");
printf ("lesestift fra pipe ... \ n");
Les (pipefds [0], buffer, 5);
printf ("Ferdig.\ n \ n ");
printf ("pin from pipe: %s \ n", buffer);
return 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-karakter pin-kode i en røye Array. Lengden på matrisen er 5 (inkludert nullkarakteren \ 0).

char *pin = "4128 \ 0";

Hver ASCII -karakter er 1 byte i størrelse i C. Så for å sende den firesifrede pinnen gjennom røret, må du skrive 5 byte (4 + 1 nullkarakter) av data inn i røret.

Å skrive 5 byte data (Pin) I røret brukte jeg skrive() Funksjon ved hjelp av skrivepipefilbeskrivelsen PIPEFDS [1] følgende.

skriv (pipefds [1], pin, 5);

Nå som jeg har noen data i røret, kan jeg lese den fra røret ved hjelp av lese() Funksjon på lesepipefilbeskrivelsen pipefds [0]. Som jeg har skrevet 5 byte med data (Pin) inn i røret, vil jeg lese 5 byte data fra røret også. Data som leses vil bli lagret i buffer Karakterer. Som jeg skal lese 5 byte med data fra røret, buffer Karakterer må være minst 5 byte lang.

Jeg har definert buffer tegnarray i begynnelsen av hoved() funksjon.

char buffer [5];

Nå kan jeg lese pinnen fra røret og lagre den i buffer matrise med følgende linje.

Les (pipefds [0], buffer, 5);

Nå som jeg har lest pinnen fra røret, kan jeg skrive den ut ved å bruke printf () funksjon som vanlig.

printf ("pin from pipe: %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_pipe.c Som skriv inn følgende koderlinjer.

#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
int main (void)
int pipefds [2];
char *pin;
char buffer [5];
if (pipe (pipefds) == -1)
Perror ("Pipe");
exit (exit_failure);

pid_t pid = gaffel ();
if (pid == 0) // i barneprosess
pin = "4821 \ 0"; // Pin for å sende
Lukk (pipefds [0]); // Lukk Les FD
skriv (pipefds [1], pin, 5); // Skriv pin til Pipe
printf ("generere pin i barnet og sende til foreldre ... \ n");
søvn (2); // forsinket forsinkelse
exit (exit_success);

if (pid> 0) // i hovedprosessen
vent (null); // Vent til barneprosessen skal fullføre
Lukk (pipefds [1]); // Lukk skriv FD
Les (pipefds [0], buffer, 5); // Les Pin fra Pipe
Lukk (pipefds [0]); // Lukk Les FD
printf ("foreldre mottatt pin '%s' \ n", buffer);

return exit_success;

I dette eksemplet viste jeg deg hvordan du bruker Pipe for interprosess-kommunikasjon. Jeg har sendt en pin fra barneprosessen til overordnet prosess ved hjelp av et rør. Les deretter tapp.

Først har jeg opprettet en barneprosess ved hjelp av gaffel () -funksjonen.

pid_t pid = gaffel ();

Da, i barneprosessen (PID == 0), Skrev jeg pinnen til røret ved hjelp av skrive() funksjon.

skriv (pipefds [1], pin, 5);

Når pinnen er skrevet til røret fra barneprosessen, er foreldreprosessen (PID> 0) Les den fra røret ved hjelp av lese() funksjon.

Les (pipefds [0], buffer, 5);

Deretter trykket foreldreprosessen pinnen ved hjelp av printf () funksjon som vanlig.

printf ("foreldre mottatt pin '%s' \ n", buffer);

Som du ser, gir å kjøre programmet det forventede resultatet.

Eksempel 4:

Opprett en ny C -kildefil 4_pipe.c Som skriv inn følgende koderlinjer.

#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
#define pin_length 4
#define pin_wait_interval 2
void 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 (void)
mens (1)
int pipefds [2];
char pin [pin_length + 1];
char buffer [pin_length + 1];
rør (pipefds);
pid_t pid = gaffel ();
if (pid == 0)
getpin (pin); // generere pin
Lukk (pipefds [0]); // Lukk Les FD
skriv (pipefds [1], pin, pin_length + 1); // Skriv pin til Pipe
printf ("generere pin i barnet og sende til foreldre ... \ n");
søvn (pin_wait_interval); // forsinkelse av pin -generasjon med vilje.
exit (exit_success);

if (pid> 0)
vent (null); // venter på at barnet skal fullføre
Lukk (pipefds [1]); // Lukk skriv FD
Les (pipefds [0], buffer, pin_length + 1); // Les Pin fra Pipe
Lukk (pipefds [0]); // Lukk Les FD
printf ("Parent mottok pin '%s' fra barn.\ n \ n ", buffer);


return exit_success;

Dette eksemplet er det samme som Eksempel 3. Den eneste forskjellen er at dette programmet kontinuerlig oppretter en barneprosess, genererer en pinne i barneprosessen og sender pinnen til overordnet prosess ved hjelp av et rør.

Foreldreprosessen leser deretter tappen fra røret og skriver den ut.

Dette programmet genererer en ny pin_length -pin hvert pin_wait_interval sekunder.

Som du ser fungerer programmet som forventet.

Du kan bare stoppe programmet ved å trykke + C.

Så det er slik du bruker PIPE () Systemanrop på programmeringsspråk. Takk for at du leste denne artikkelen.