Kuinka käyttää putkitoimintoa C -kielellä

How Use Pipe Function C Language



Putki on väline prosessien väliseen viestintään. Yksi prosessi kirjoittaa tietoja putkeen ja toinen prosessi lukee tiedot putkesta. Tässä artikkelissa näemme, miten pipe () -funktiota käytetään konseptin toteuttamiseen C -kielellä.

Tietoja Pipe

Putkessa tiedot säilytetään FIFO -järjestyksessä, mikä tarkoittaa tietojen kirjoittamista putken toiseen päähän peräkkäin ja tietojen lukemista putken toisesta päästä samassa järjestyksessä.







Jos jokin prosessi lukee putkesta, mutta mikään muu prosessi ei ole vielä kirjoittanut putkeen, luku palauttaa tiedoston lopun. Jos prosessi haluaa kirjoittaa putkeen, mutta putkeen ei ole liitetty muuta prosessia lukemista varten, tämä on virhetila ja putki tuottaa SIGPIPE -signaalin.



Otsikkotiedosto

#sisältää

Syntaksi



intputki(inttiedostot[2])

Argumentit

Tämä funktio ottaa yhden argumentin, kahden kokonaisluvun ( tiedostot ). tiedostot [0] käytetään putken lukemiseen ja tiedostot [1] käytetään putkeen kirjoittamiseen. Prosessin, joka haluaa lukea putkesta, pitäisi sulkeutua tiedostot [1], ja prosessin, joka haluaa kirjoittaa putkeen, tulee sulkeutua tiedostot [0] . Jos putken tarpeettomia päitä ei suljeta nimenomaisesti, tiedoston loppua (EOF) ei koskaan palauteta.





Palauta arvot

Menestyksessä, putki() palauttaa 0, epäonnistumisen yhteydessä funktio palauttaa -1.

Kuvallisesti voimme edustaa putki() toimi seuraavasti:



Alla on muutamia esimerkkejä siitä, miten putkitoimintoa käytetään C -kielellä.

Esimerkki 1

Tässä esimerkissä näemme kuinka putkitoiminto toimii. Vaikka putken käyttäminen yhdessä prosessissa ei ole kovin hyödyllistä, saamme idean.

// Esimerkki1.c
#sisältää
#sisältää
#sisältää
#sisältää

inttärkein()
{
intn;
inttiedostot[2];
hiiltyäpuskuri[1025];
hiiltyä *viesti= 'Hei maailma!';

putki(tiedostot);
kirjoittaa(tiedostot[1],viesti, strlen (viesti));

jos ((n=lukea(tiedostot[0],puskuri, 1024 ) ) > = 0) {
puskuri[n] = 0; // lopettaa merkkijono
printf ('lukee %d tavua putkesta:'%s'' n'',n,puskuri);
}
muu
virhe ('lukea');
poistua (0);
}

Tässä olemme ensin luoneet putken käyttämällä putki() funktio kirjoitetaan sitten putkeen käyttämällä norsunluu [1] loppuun. Sitten tiedot on luettu käyttämällä putken toista päätä, joka on tiedostot [0] . Käytimme ennen tiedoston lukemista ja kirjoittamista lukea() ja kirjoittaa() toimintoja.

Esimerkki 2

Tässä esimerkissä näemme, kuinka vanhemman ja lapsen prosessit kommunikoivat putken avulla.

// Esimerkki2.c
#sisältää
#sisältää
#sisältää
#sisältää
#sisältää

inttärkein()
{
inttiedostot[2],nbytes;
pid_t lapsellinen;
hiiltyämerkkijono[] = 'Hei maailma! n'';
hiiltyälukupuskuri[80];

putki(tiedostot);

jos((lapsellinen=haarukka()) == -1)
{
virhe ('haarukka');
poistua (1);
}

jos(lapsellinen== 0)
{
kiinni(tiedostot[0]);// Lapsiprosessi ei tarvitse tätä putken päätä

/ * Lähetä merkkijono putken lähtöpuolen kautta */
kirjoittaa(tiedostot[1],merkkijono, ( strlen (merkkijono)+1));
poistua (0);
}
muu
{
/ * Pääprosessi sulkee putken lähtöpuolen */
kiinni(tiedostot[1]);// Pääprosessi ei tarvitse tätä putken päätä

/ * Lue merkkijono putkesta */
nbytes=lukea(tiedostot[0],lukupuskuri, koko(lukupuskuri));
printf ('Lue merkkijono: %s',lukupuskuri);
}

palata(0);
}

Ensinnäkin yksi putki on luotu putkitoiminnolla ja sitten lapsiprosessi on haarautunut. Sitten lapsiprosessi sulkee lukupään ja kirjoittaa putkeen. Pääprosessi sulkee kirjoituspään ja lukee putkesta ja näyttää sen. Tässä tiedonkulku on vain yksi tapa lapsesta vanhempaan.

Johtopäätös:

putki() on tehokas järjestelmäpuhelu Linuxissa. Tässä artikkelissa olemme nähneet vain yksisuuntaisen datavirran, yksi prosessi kirjoittaa ja toinen prosessi lukee luoden kaksi putkea, jotka voimme saavuttaa myös kaksisuuntaisen datavirran.