Vamzdžių sistemos iškvietimas C

Pipe System Call C



vamzdis () yra „Linux“ sistemos funkcija. The vamzdis () sistemos funkcija naudojama failų aprašams atidaryti, kurie naudojami bendraujant tarp skirtingų „Linux“ procesų. Trumpai tariant, vamzdis () Ši funkcija naudojama bendravimui tarp procesų „Linux“. Šiame straipsnyje aš jums parodysiu, kaip naudoti „pipe“ () sistemos funkciją „Linux“. Taigi, pradėkime.

Sintaksė vamzdis () funkcija yra:







tarptvamzdis(tarptpipefd[2]);

Čia funkcija pipe () sukuria vienkryptį duomenų kanalą, skirtą bendravimui tarp procesų. Pravažiuoji an tarpt (Sveikasis) tipo masyvas pipefd sudarytas iš 2 masyvo elemento prie funkcinio vamzdžio (). Tada funkcija pipe () sukuria du failų aprašus pipefd masyvas.



Pirmasis elementas pipefd masyvas, pipefd [0] naudojamas duomenims iš vamzdžio nuskaityti.



Antrasis elementas pipefd masyvas, pipefd [1] naudojamas duomenims įrašyti į vamzdį.





Sėkmingai vamzdžio () funkcija grąžina 0. Jei vamzdžio inicijavimo metu įvyksta klaida, tada vamzdžio () funkcija grąžina -1.

Vamzdžio () funkcija apibrėžta antraštėje neprilygstama.h . Kad galėtumėte naudoti programą pipe () savo C programoje, turite įtraukti antraštę neprilygstama.h taip:



#įtraukti

Norėdami gauti daugiau informacijos apie vamzdžio () sistemos funkciją, patikrinkite vamzdžio () žinyno puslapį naudodami šią komandą:

$ vyras2vamzdis
Vamzdžio vyras puslapis().

1 pavyzdys:

Pirmajame pavyzdyje sukurkite naują C šaltinio failą 1_pipe.c ir įveskite šias kodų eilutes.

#įtraukti
#įtraukti
#įtraukti

tarptpagrindinis(tuštuma) {
tarptpipefds[2];

jei(vamzdis(pipefds) == -1) {
perror ('vamzdis');
išeiti (EXIT_FAILURE);
}

printf ('Skaityti failo aprašo reikšmę: %d n',pipefds[0]);
printf (Rašyti failo aprašymo reikšmę: %d n',pipefds[1]);

grįžtiEXIT_SUCCESS;
}

Čia aš įtraukiau vamzdžio () antraštės failą neprilygstama.h pirmiausia su šia eilute.

#įtraukti

Tada, pagrindinis () funkciją, aš apibrėžiau pipefds dviejų elementų sveikųjų skaičių masyvas su tokia eilute.

tarptpipefds[2];

Tada paleidau funkciją pipe (), norėdamas inicijuoti failų aprašų masyvą pipefds kaip nurodyta toliau.

vamzdis(pipefds)

Taip pat patikrinau, ar nėra klaidų, naudojant funkciją pipe (). Aš naudojau išeiti () funkcija užbaigti programą, jei vamzdžio funkcija nepavyks.

jei(vamzdis(pipefds) == -1) {
perror ('vamzdis');
išeiti (EXIT_FAILURE);
}

Tada atspausdinau skaitymo ir rašymo vamzdžių failų aprašų vertę pipefds [0] ir pipefds [1] atitinkamai.

printf ('Skaityti failo aprašo reikšmę: %d n',pipefds[0]);
printf (Rašyti failo aprašymo reikšmę: %d n',pipefds[1]);

Jei paleisite programą, turėtumėte pamatyti šią išvestį. Kaip matote, skaitymo vamzdžio failo deskriptoriaus vertė pipefds [0] yra 3 ir parašykite vamzdžio failo aprašą pipefds [1] yra 4 .

2 pavyzdys:

Sukurkite kitą C šaltinio failą 2_pipe.c ir įveskite šias kodų eilutes.

#įtraukti
#įtraukti
#įtraukti
#įtraukti

tarptpagrindinis(tuštuma) {
tarptpipefds[2];
anglisbuferis[5];

jei(vamzdis(pipefds) == -1) {
perror ('vamzdis');
išeiti (EXIT_FAILURE);
}

anglis *smeigtukas= „4128 0';

printf („Rašomas PIN kodas vamzdžiui ... n');
rašyti(pipefds[1],smeigtukas, 5);
printf ('Padaryta. n n');

printf („Skaitomas PIN kodas iš vamzdžio ... n');
skaityti(pipefds[0],buferis, 5);
printf ('Padaryta. n n');

printf ('PIN kodas iš vamzdžio: %s n',buferis);

grįžtiEXIT_SUCCESS;
}

Ši programa iš esmės parodo, kaip rašyti į vamzdį ir skaityti duomenis, kuriuos parašėte iš vamzdžio.

Čia aš išsaugojau 4 simbolių PIN kodą anglis masyvas. Masyvo ilgis yra 5 (įskaitant simbolį NULL 0).

anglis *smeigtukas= „4128 0';

Kiekvienas ASCII simbolis yra 1 baito dydžio C. Taigi, norėdami siųsti 4 skaitmenų PIN kodą per vamzdį, turite į vamzdį įrašyti 5 baitus (4 + 1 NULL simbolis) duomenų.

Norėdami parašyti 5 baitus duomenų ( smeigtukas ) į vamzdį, aš naudoju rašyti () funkcija naudojant įrašymo vamzdžio failo deskriptorių pipefds [1] kaip nurodyta toliau.

rašyti(pipefds[1],smeigtukas, 5);

Dabar, kai vamzdyje turiu tam tikrų duomenų, galiu juos nuskaityti iš vamzdžio naudodami skaityti () funkcija skaitymo vamzdžio failo apraše pipefds [0] . Aš parašiau 5 baitus duomenų ( smeigtukas ) į vamzdį, aš taip pat skaitysiu 5 baitus duomenų iš vamzdžio. Nuskaityti duomenys bus saugomi buferis simbolių masyvas. Kai skaitysiu 5 baitus duomenų iš vamzdžio, buferis simbolių masyvas turi būti bent 5 baitų ilgio.

Aš apibrėžiau buferis simbolių masyvas pradžioje pagrindinis () funkcija.

anglisbuferis[5];

Dabar galiu nuskaityti PIN kodą iš vamzdžio ir išsaugoti jį buferis masyvas su tokia eilute.

skaityti(pipefds[0],buferis, 5);

Dabar, kai perskaičiau PIN kodą iš vamzdžio, galiu jį atspausdinti naudodami printf () funkcionuoti kaip įprasta.

printf ('PIN kodas iš vamzdžio: %s n',buferis);

Kai paleidžiu programą, rodoma teisinga išvestis, kaip matote.

3 pavyzdys:

Sukurkite naują C šaltinio failą 3_pipe.c kaip įveskite šias kodų eilutes.

#įtraukti
#įtraukti
#įtraukti
#įtraukti
#įtraukti
tarptpagrindinis(tuštuma) {
tarptpipefds[2];
anglis *smeigtukas;
anglisbuferis[5];

jei(vamzdis(pipefds) == -1) {
perror ('vamzdis');
išeiti (EXIT_FAILURE);
}

pid_t pid=šakutė();

jei(pid== 0) { // vaiko procese
smeigtukas= „4821 m 0'; // PIN siusti
Uždaryti(pipefds[0]); // uždaryti skaityti fd
rašyti(pipefds[1],smeigtukas, 5); // rašyti PIN į vamzdį

printf („Sukuriamas PIN kodas vaikui ir siunčiamas tėvui ... n');
miegoti(2); // tyčinis delsimas
išeiti (EXIT_SUCCESS);
}

jei(pid> 0) { // pagrindiniame procese
laukti(NULL); // laukti, kol baigsis vaiko procesas
Uždaryti(pipefds[1]); // uždaryti rašyti fd
skaityti(pipefds[0],buferis, 5); // skaityti PIN kodą iš vamzdžio
Uždaryti(pipefds[0]); // uždaryti skaityti fd

printf („Tėvas gavo PIN kodą„%s “ n',buferis);
}

grįžtiEXIT_SUCCESS;
}

Šiame pavyzdyje aš parodžiau, kaip naudoti vamzdį tarpusavio ryšiui. Aš išsiunčiau PIN kodą iš vaiko proceso į pirminį procesą naudodami vamzdį. Tada perskaitykite PIN kodą iš vamzdžio pirminiame procese ir atsispausdinkite jį iš pirminio proceso.

Pirma, sukūriau vaiko procesą, naudodamas šakės () funkciją.

pid_t pid=šakutė();

Tada vaiko procese ( pid == 0 ), Aš parašiau PIN kodą prie vamzdžio naudodamas rašyti () funkcija.

rašyti(pipefds[1],smeigtukas, 5);

Kai PIN kodas įrašomas į vamzdį iš antrinio proceso, pirminis procesas ( pid> 0 ) perskaitykite jį iš vamzdžio naudodami skaityti () funkcija.

skaityti(pipefds[0],buferis, 5);

Tada pirminis procesas atspausdino PIN kodą printf () funkcionuoti kaip įprasta.

printf („Tėvas gavo PIN kodą„%s “ n',buferis);

Kaip matote, programos paleidimas duoda laukiamą rezultatą.

4 pavyzdys:

Sukurkite naują C šaltinio failą 4_pipe.c kaip įveskite šias kodų eilutes.

#įtraukti
#įtraukti
#įtraukti
#įtraukti
#įtraukti

#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2

tuštumagetPIN(anglissmeigtukas[PIN_LENGTH+ 1]) {
srand (kvailas() +nusiteikęs());

smeigtukas[0] = 49 + eilė () % 7;

dėl(tarpti= 1;i<PIN_LENGTH;i++) {
smeigtukas[i] = 48 + eilė () % 7;
}

smeigtukas[PIN_LENGTH] = ' 0';
}


tarptpagrindinis(tuštuma) {
tuo tarpu(1) {
tarptpipefds[2];
anglissmeigtukas[PIN_LENGTH+ 1];
anglisbuferis[PIN_LENGTH+ 1];

vamzdis(pipefds);

pid_t pid=šakutė();

jei(pid== 0) {
getPIN(smeigtukas); // generuoti PIN kodą
Uždaryti(pipefds[0]); // uždaryti skaityti fd
rašyti(pipefds[1],smeigtukas,PIN_LENGTH+ 1); // rašyti PIN į vamzdį

printf („Sukuriamas PIN kodas vaikui ir siunčiamas tėvui ... n');

miegoti(PIN_WAIT_INTERVAL); // tyčia atidėti PIN generavimą.

išeiti (EXIT_SUCCESS);
}

jei(pid> 0) {
laukti(NULL); // laukiu, kol vaikas baigs

Uždaryti(pipefds[1]); // uždaryti rašyti fd
skaityti(pipefds[0],buferis,PIN_LENGTH+ 1); // skaityti PIN kodą iš vamzdžio
Uždaryti(pipefds[0]); // uždaryti skaityti fd
printf („Tėvas gavo PIN kodą„%s “iš vaiko. n n',buferis);
}
}

grįžtiEXIT_SUCCESS;
}

Šis pavyzdys yra toks pat kaip 3 pavyzdys . Vienintelis skirtumas yra tas, kad ši programa nuolat sukuria antrinį procesą, sukuria PIN kodą vaiko procese ir siunčia PIN kodą pirminiam procesui naudodami vamzdį.

Tada pirminis procesas nuskaito PIN kodą iš vamzdžio ir jį išspausdina.

Ši programa kas PIN_WAIT_INTERVAL sekundę sukuria naują PIN_LENGTH PIN kodą.

Kaip matote, programa veikia taip, kaip tikėtasi.

Programą galite sustabdyti tik paspausdami + C .

Taigi, taip jūs naudojate „pipe“ () sistemos iškvietimą C programavimo kalba. Dėkojame, kad perskaitėte šį straipsnį.