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:
$ mies2putkiPutken 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.