Rørsystemopkald i C

Pipe System Call C



rør() er en Linux -systemfunktion. Det rør() systemfunktion bruges til at åbne filbeskrivelser, der bruges til at kommunikere mellem forskellige Linux -processer. Kort sagt, rør() funktion bruges til kommunikation mellem processer i Linux. I denne artikel vil jeg vise dig, hvordan du bruger pipe () systemfunktionen i Linux. Så lad os komme i gang.

Syntaksen for rør() funktion er:







intrør(intpipefd[2]);

Her skaber funktionen pipe () en ensrettet datakanal til kommunikation mellem processer. Du passerer i en int (Heltal) type array pipefd bestående af 2 array -element til funktionsrøret (). Derefter opretter funktionen pipe () to filbeskrivelser i pipefd array.



Det første element i pipefd array, pipefd [0] bruges til at aflæse data fra røret.



Det andet element i pipefd array, pipefd [1] bruges til at skrive data til røret.





Efter succes returnerer funktionen pipe () 0. Hvis der opstår en fejl under initialisering af rør, returnerer funktionen pipe () -1.

Funktionen pipe () er defineret i overskriften unistd.h . For at bruge funktionen pipe () i dit C -program skal du inkludere headeren unistd.h som følger:



#omfatte

For mere information om rør () systemfunktionen, kontroller man -siden for rør () med følgende kommando:

$ mand2rør
Mandsiden af ​​rør().

Eksempel 1:

For det første eksempel skal du oprette en ny C -kildefil 1_rør.c og indtast følgende kodelinjer.

#omfatte
#omfatte
#omfatte

intvigtigste(ugyldig) {
intpipefds[2];

hvis(rør(pipefds) == -1) {
perror ('rør');
Afslut (EXIT_FAILURE);
}

printf ('Læs filbeskrivelsesværdi: %d n',pipefds[0]);
printf ('Skriv filbeskrivelsesværdi: %d n',pipefds[1]);

Vend tilbageEXIT_SUCCESS;
}

Her inkluderede jeg header -filen til pipe () unistd.h først med følgende linje.

#omfatte

Derefter i main () funktion, definerede jeg pipefds toelementers heltal array med følgende linje.

intpipefds[2];

Derefter kørte jeg pipe () -funktionen for at initialisere filbeskrivelsesmatrixen pipefds som følger.

rør(pipefds)

Jeg kontrollerede også for fejl ved hjælp af returværdien af ​​funktionen pipe (). Jeg brugte Afslut() funktion til at afslutte programmet, hvis rørfunktionen mislykkes.

hvis(rør(pipefds) == -1) {
perror ('rør');
Afslut (EXIT_FAILURE);
}

Derefter udskriver jeg værdien af ​​læse- og skrivepipe -filbeskrivere pipefds [0] og pipefds [1] henholdsvis.

printf ('Læs filbeskrivelsesværdi: %d n',pipefds[0]);
printf ('Skriv filbeskrivelsesværdi: %d n',pipefds[1]);

Hvis du kører programmet, skal du se følgende output. Som du kan se, er værdien af ​​read pipe file descriptor pipefds [0] er 3 og skriv rørfilbeskrivelse pipefds [1] er 4 .

Eksempel 2:

Opret en anden C -kildefil 2_rør.c og indtast følgende kodelinjer.

#omfatte
#omfatte
#omfatte
#omfatte

intvigtigste(ugyldig) {
intpipefds[2];
forkælelsebuffer[5];

hvis(rør(pipefds) == -1) {
perror ('rør');
Afslut (EXIT_FAILURE);
}

forkælelse *pin= '4128 0';

printf ('Skrivning af pinkode til rør ... n');
skrive(pipefds[1],pin, 5);
printf ('Færdig. n n');

printf ('Læser pinkode fra rør ... n');
Læs(pipefds[0],buffer, 5);
printf ('Færdig. n n');

printf ('PIN fra rør: %s n',buffer);

Vend tilbageEXIT_SUCCESS;
}

Dette program viser dig dybest set, hvordan du skriver til røret og læser de data, du har skrevet fra røret.

Her gemte jeg en 4-tegn PIN-kode i en forkælelse array. Længden af ​​arrayet er 5 (inklusive NULL -tegnet 0).

forkælelse *pin= '4128 0';

Hvert ASCII -tegn er 1 byte i størrelse i C. Så for at sende den firecifrede PIN -kode gennem røret, skal du skrive 5 bytes (4 + 1 NULL -tegn) data i røret.

At skrive 5 bytes data ( pin ) ind i røret, brugte jeg skrive() funktion ved hjælp af skriverørfilbeskrivelsen pipefds [1] som følger.

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

Nu hvor jeg har nogle data i røret, kan jeg læse det fra røret ved hjælp af Læs() funktion på read pipe -filbeskrivelsen pipefds [0] . Da jeg har skrevet 5 bytes data ( pin ) ind i røret, vil jeg også læse 5 bytes data fra røret. De læste data gemmes i buffer karakter array. Da jeg vil læse 5 bytes data fra røret, vil buffer tegnsæt skal være mindst 5 bytes langt.

Jeg har defineret buffer tegnsæt i begyndelsen af main () fungere.

forkælelsebuffer[5];

Nu kan jeg læse PIN -koden fra røret og gemme den i buffer array med følgende linje.

Læs(pipefds[0],buffer, 5);

Nu hvor jeg har læst PIN -koden fra røret, kan jeg udskrive den ved hjælp af printf () fungere som normalt.

printf ('PIN fra rør: %s n',buffer);

Når jeg har kørt programmet, vises det korrekte output, som du kan se.

Eksempel 3:

Opret en ny C -kildefil 3_pipe.c som indtastning i følgende kodelinjer.

#omfatte
#omfatte
#omfatte
#omfatte
#omfatte
intvigtigste(ugyldig) {
intpipefds[2];
forkælelse *pin;
forkælelsebuffer[5];

hvis(rør(pipefds) == -1) {
perror ('rør');
Afslut (EXIT_FAILURE);
}

pid_t pid=gaffel();

hvis(pid== 0) { // i barneproces
pin= '4821 0'; // PIN -kode til afsendelse
tæt(pipefds[0]); // tæt læs fd
skrive(pipefds[1],pin, 5); // skriv pinkode til rør

printf ('Genererer pinkode i barn og sender til forælder ... n');
søvn(2); // forsætlig forsinkelse
Afslut (EXIT_SUCCESS);
}

hvis(pid> 0) { // i hovedprocessen
vente(NUL); // vent på, at barneprocessen er færdig
tæt(pipefds[1]); // luk skrive fd
Læs(pipefds[0],buffer, 5); // læs pinkode fra rør
tæt(pipefds[0]); // tæt læs fd

printf ('Forælder modtog pinkode'%s ' n',buffer);
}

Vend tilbageEXIT_SUCCESS;
}

I dette eksempel viste jeg dig, hvordan du bruger rør til kommunikation mellem processer. Jeg har sendt en pinkode fra barneprocessen til forældreprocessen ved hjælp af et rør. Læs derefter PIN -koden fra røret i den overordnede proces og udskriv den fra den overordnede proces.

For det første har jeg oprettet en børneproces ved hjælp af gaffel () -funktionen.

pid_t pid=gaffel();

I barneprocessen ( pid == 0 ), Skrev jeg PIN -koden til røret ved hjælp af skrive() fungere.

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

Når PIN -koden er skrevet til røret fra barneprocessen, forælderprocessen ( pid> 0 ) læse det fra røret ved hjælp af Læs() fungere.

Læs(pipefds[0],buffer, 5);

Derefter udskrev forældreprocessen pinkoden ved hjælp af printf () fungere som normalt.

printf ('Forælder modtog pinkode'%s ' n',buffer);

Som du kan se, giver programmet et forventet resultat ved at køre programmet.

Eksempel 4:

Opret en ny C -kildefil 4_rør.c som indtastning i følgende kodelinjer.

#omfatte
#omfatte
#omfatte
#omfatte
#omfatte

#define PIN_LENGTH 4
#definer PIN_WAIT_INTERVAL 2

ugyldiggetPIN(forkælelsepin[PIN_LENGTH+ 1]) {
srand (getpid() +blive ked af det());

pin[0] = 49 + række () % 7;

til(intjeg= 1;jeg<PIN_LENGTH;jeg++) {
pin[jeg] = 48 + række () % 7;
}

pin[PIN_LENGTH] = ' 0';
}


intvigtigste(ugyldig) {
mens(1) {
intpipefds[2];
forkælelsepin[PIN_LENGTH+ 1];
forkælelsebuffer[PIN_LENGTH+ 1];

rør(pipefds);

pid_t pid=gaffel();

hvis(pid== 0) {
getPIN(pin); // generer pinkode
tæt(pipefds[0]); // tæt læs fd
skrive(pipefds[1],pin,PIN_LENGTH+ 1); // skriv pinkode til rør

printf ('Genererer pinkode i barn og sender til forælder ... n');

søvn(PIN_WAIT_INTERVAL); // forsinket generering af pinkode med vilje.

Afslut (EXIT_SUCCESS);
}

hvis(pid> 0) {
vente(NUL); // venter på, at barnet er færdigt

tæt(pipefds[1]); // luk skrive fd
Læs(pipefds[0],buffer,PIN_LENGTH+ 1); // læs pinkode fra rør
tæt(pipefds[0]); // tæt læs fd
printf ('Forælder modtog pinkode'%s 'fra barn. n n',buffer);
}
}

Vend tilbageEXIT_SUCCESS;
}

Dette eksempel er det samme som Eksempel 3 . Den eneste forskel er, at dette program løbende opretter en børneproces, genererer en pinkode i barneprocessen og sender PIN -koden til den overordnede proces ved hjælp af et rør.

Forælderprocessen læser derefter PIN -koden fra røret og udskriver den.

Dette program genererer en ny PIN_LENGTH PIN hver PIN_WAIT_INTERVAL sekund.

Som du kan se, fungerer programmet som forventet.

Du kan kun stoppe programmet ved at trykke på + C .

Så dette er, hvordan du bruger pipe () systemopkaldet i C -programmeringssprog. Tak fordi du læste denne artikel.