Putkijärjestelmän puhelu C: ssä

Pipe System Call C



putki() on Linux -järjestelmän toiminto. The putki() järjestelmätoimintoa käytetään tiedostojen kuvausten avaamiseen, joita käytetään kommunikoimaan eri Linux -prosessien välillä. Lyhyesti sanottuna putki() -toimintoa käytetään prosessien väliseen viestintään Linuxissa. Tässä artikkelissa aion näyttää sinulle, kuinka käyttää pipe () -toimintoa Linuxissa. Aloitetaan siis.

Syntaksi putki() toiminto on:







intputki(intpipefd[2]);

Tässä pipe () -toiminto luo yksisuuntaisen datakanavan prosessien väliseen viestintään. Menet sisään int (Kokonaisluku) -tyyppinen taulukko pipefd joka koostuu 2 matriisielementistä toimintoputkeen (). Sitten pipe () -funktio luo tiedostoon kaksi tiedostojen kuvaajaa pipefd matriisi.



Ensimmäinen elementti pipefd matriisi, pipefd [0] käytetään tietojen lukemiseen putkesta.



Toinen elementti pipefd matriisi, pipefd [1] käytetään tietojen kirjoittamiseen putkeen.





Onnistuessaan funktio pipe () palauttaa arvon 0. Jos putken alustuksen aikana tapahtuu virhe, pipe () -funktio palauttaa -1.

Pipe () -toiminto on määritetty otsikossa tunnistamaton. h . Jotta voit käyttää pipe () -toimintoa C -ohjelmassasi, sinun on sisällytettävä otsikko tunnistamaton. h seuraavasti:



#sisältää

Jos haluat lisätietoja putkijärjestelmän toiminnasta, tarkista putken () man -sivu seuraavalla komennolla:

$ mies2putki
Putken man -sivu().

Esimerkki 1:

Luo ensimmäinen esimerkki luomalla uusi C -lähdetiedosto 1_pipe.c ja kirjoita seuraavat koodirivit.

#sisältää
#sisältää
#sisältää

inttärkein(mitätön) {
intpipefds[2];

jos(putki(pipefds) == -1) {
virhe ('putki');
poistua (EXIT_FAILURE);
}

printf ('Lue tiedoston kuvaajan arvo: %d n'',pipefds[0]);
printf ('Kirjoita tiedoston kuvaajan arvo: %d n'',pipefds[1]);

palataEXIT_SUCCESS;
}

Tässä lisäsin putken otsikkotiedoston () tunnistamaton. h ensin seuraavalla rivillä.

#sisältää

Sitten, pää () toiminto, määritin pipefds kahden elementin kokonaislukutaulukko, jossa on seuraava rivi.

intpipefds[2];

Suoritin sitten pipe () -toiminnon tiedostojen kuvaajan matriisin alustamiseksi pipefds seuraavasti.

putki(pipefds)

Tarkistin myös virheet käyttämällä funktiota pipe () palautusarvoa. Käytin poistu () toiminto ohjelman päättämiseksi, jos putkitoiminto epäonnistuu.

jos(putki(pipefds) == -1) {
virhe ('putki');
poistua (EXIT_FAILURE);
}

Sitten tulostin luku- ja kirjoitusputkikuvien kuvaajan arvon pipefds [0] ja pipefds [1] vastaavasti.

printf ('Lue tiedoston kuvaajan arvo: %d n'',pipefds[0]);
printf ('Kirjoita tiedoston kuvaajan arvo: %d n'',pipefds[1]);

Jos suoritat ohjelman, sinun pitäisi nähdä seuraava tulos. Kuten näette, lukuputketiedoston kuvaajan arvo pipefds [0] On 3 ja kirjoita putketiedoston kuvaaja pipefds [1] On 4 .

Esimerkki 2:

Luo toinen C -lähdetiedosto 2_pipe.c ja kirjoita seuraavat koodirivit.

#sisältää
#sisältää
#sisältää
#sisältää

inttärkein(mitätön) {
intpipefds[2];
hiiltyäpuskuri[5];

jos(putki(pipefds) == -1) {
virhe ('putki');
poistua (EXIT_FAILURE);
}

hiiltyä *tappi= '4128 0'';

printf ('Kirjoitetaan PIN -koodia putkeen ... n'');
kirjoittaa(pipefds[1],tappi, 5);
printf ('Tehty. n n'');

printf ('PIN -koodin lukeminen putkesta ... n'');
lukea(pipefds[0],puskuri, 5);
printf ('Tehty. n n'');

printf ('PIN -koodi putkesta: %s n'',puskuri);

palataEXIT_SUCCESS;
}

Tämä ohjelma näyttää pohjimmiltaan kuinka kirjoittaa putkeen ja lukea putkesta kirjoittamasi tiedot.

Tallensin tähän 4-merkkisen PIN-koodin hiiltyä matriisi. Taulukon pituus on 5 (sisältäen NULL -merkin 0).

hiiltyä *tappi= '4128 0'';

Jokainen ASCII -merkki on 1 tavua C.

5 tavun tietojen kirjoittaminen ( tappi ) putkeen, käytin kirjoittaa() -toimintoa käyttämällä kirjoitusputketiedoston kuvaajaa pipefds [1] seuraavasti.

kirjoittaa(pipefds[1],tappi, 5);

Nyt kun minulla on joitain tietoja putkessa, voin lukea sen putkesta käyttämällä lukea() -toiminto lukuputketiedoston kuvaajalla pipefds [0] . Kuten olen kirjoittanut 5 tavua dataa ( tappi ) putkeen, aion lukea myös 5 tavua dataa putkesta. Luetut tiedot tallennetaan puskuri merkkijono. Kun luen 5 tavua dataa putkesta, puskuri merkkijonon on oltava vähintään 5 tavua pitkä.

Olen määritellyt puskuri merkkijonon alussa pää () toiminto.

hiiltyäpuskuri[5];

Nyt voin lukea PIN -koodin putkesta ja tallentaa sen puskuri matriisi seuraavalla rivillä.

lukea(pipefds[0],puskuri, 5);

Nyt kun olen lukenut PIN -koodin putkesta, voin tulostaa sen käyttämällä printf () toimi normaalisti.

printf ('PIN -koodi putkesta: %s n'',puskuri);

Kun olen suorittanut ohjelman, oikea ulostulo näkyy, kuten näet.

Esimerkki 3:

Luo uusi C -lähdetiedosto 3_pipe.c kirjoita seuraavat koodirivit.

#sisältää
#sisältää
#sisältää
#sisältää
#sisältää
inttärkein(mitätön) {
intpipefds[2];
hiiltyä *tappi;
hiiltyäpuskuri[5];

jos(putki(pipefds) == -1) {
virhe ('putki');
poistua (EXIT_FAILURE);
}

pid_t pid=haarukka();

jos(pid== 0) { // lapsiprosessissa
tappi= '' 4821 0''; // PIN lähetettäväksi
kiinni(pipefds[0]); // sulje lue fd
kirjoittaa(pipefds[1],tappi, 5); // kirjoittaa PIN putkeen

printf ('PIN -koodin luominen lapselle ja lähettäminen vanhemmalle ... n'');
nukkua(2); // tahallinen viivästyminen
poistua (EXIT_SUCCESS);
}

jos(pid> 0) { // pääprosessissa
odota(TYHJÄ); // odota lapsiprosessin päättymistä
kiinni(pipefds[1]); // sulje kirjoita fd
lukea(pipefds[0],puskuri, 5); // lukee PIN -koodin putkesta
kiinni(pipefds[0]); // sulje lue fd

printf ('Vanhempi sai PIN -koodin'%s ' n'',puskuri);
}

palataEXIT_SUCCESS;
}

Tässä esimerkissä näytin sinulle kuinka käyttää putkea prosessien välisessä viestinnässä. Olen lähettänyt PIN -koodin aliprosessista vanhempien prosessiin käyttämällä putkea. Lue sitten PIN -koodi pääprosessin putkesta ja tulosta se pääprosessista.

Ensin olen luonut lapsiprosessin haarukan () -funktiolla.

pid_t pid=haarukka();

Sitten lapsiprosessissa ( pid == 0 ), Kirjoitin PIN -koodin putkeen käyttämällä kirjoittaa() toiminto.

kirjoittaa(pipefds[1],tappi, 5);

Kun PIN -koodi on kirjoitettu putkeen aliprosessista, pääprosessi ( pid> 0 ) lue se putkesta käyttämällä lukea() toiminto.

lukea(pipefds[0],puskuri, 5);

Sen jälkeen vanhempi prosessi tulosti PIN -koodin printf () toimi normaalisti.

printf ('Vanhempi sai PIN -koodin'%s ' n'',puskuri);

Kuten näette, ohjelman suorittaminen antaa odotetun tuloksen.

Esimerkki 4:

Luo uusi C -lähdetiedosto 4_pipe.c kirjoita seuraavat koodirivit.

#sisältää
#sisältää
#sisältää
#sisältää
#sisältää

#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2

mitätöngetPIN(hiiltyätappi[PIN_LENGTH+ 1]) {
srand (hölmö() +kiihkeä());

tappi[0] = 49 + rivi () % 7;

varten(inti= 1;i<PIN_LENGTH;i++) {
tappi[i] = 48 + rivi () % 7;
}

tappi[PIN_LENGTH] = '' 0'';
}


inttärkein(mitätön) {
sillä aikaa(1) {
intpipefds[2];
hiiltyätappi[PIN_LENGTH+ 1];
hiiltyäpuskuri[PIN_LENGTH+ 1];

putki(pipefds);

pid_t pid=haarukka();

jos(pid== 0) {
getPIN(tappi); // luo PIN -koodi
kiinni(pipefds[0]); // sulje lue fd
kirjoittaa(pipefds[1],tappi,PIN_LENGTH+ 1); // kirjoittaa PIN putkeen

printf ('PIN -koodin luominen lapselle ja lähettäminen vanhemmalle ... n'');

nukkua(PIN_WAIT_INTERVAL); // viivyttää PIN -koodin luomista tarkoituksella.

poistua (EXIT_SUCCESS);
}

jos(pid> 0) {
odota(TYHJÄ); // odotellaan lapsen lopettamista

kiinni(pipefds[1]); // sulje kirjoita fd
lukea(pipefds[0],puskuri,PIN_LENGTH+ 1); // lukee PIN -koodin putkesta
kiinni(pipefds[0]); // sulje lue fd
printf ('Vanhempi sai PIN -koodin'%s 'lapselta. n n'',puskuri);
}
}

palataEXIT_SUCCESS;
}

Tämä esimerkki on sama kuin Esimerkki 3 . Ainoa ero on, että tämä ohjelma luo jatkuvasti aliprosessin, luo PIN -koodin aliprosessiin ja lähettää PIN -koodin pääprosessille putken avulla.

Pääprosessi lukee sitten PIN -koodin putkesta ja tulostaa sen.

Tämä ohjelma luo uuden PIN_LENGTH PIN -koodin PIN_WAIT_INTERVAL sekunnin välein.

Kuten huomaat, ohjelma toimii odotetulla tavalla.

Voit pysäyttää ohjelman vain painamalla + C .

Joten, näin käytät pipe () - järjestelmän kutsua C -ohjelmointikielellä. Kiitos tämän artikkelin lukemisesta.