Putki on väliaine 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-kieltä käyttäen.
Tietoja Pipestä
Putkessa data pidetää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, read 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
int putki (int filedes [2])Väitteet
Tämä funktio vie yhden argumentin, kahden kokonaisluvun taulukon (filedes). filedes [0] käytetään lukemiseen putkesta ja filedes [1] käytetään kirjoittamiseen putkeen. Prosessi, joka haluaa lukea putkesta, pitäisi sulkea filedes [1], ja prosessin, joka haluaa kirjoittaa putkeen, pitäisi sulkeutua filedes [0]. Jos putken tarpeettomia päitä ei ole nimenomaisesti suljettu, tiedostopäätä (EOF) ei koskaan palauteta.
Palautusarvot
Menestyksen jälkeen putki() palauttaa arvon 0, epäonnistumisen yhteydessä funktio palauttaa arvon -1.
Kuvallisesti voimme edustaa putki() toimi seuraavasti:
Alla on muutama esimerkki, joka kuvaa putkitoiminnon käyttöä C-kielellä.
Esimerkki 1
Tässä esimerkissä näemme, miten putkitoiminto toimii. Vaikka putken käyttö yhdessä prosessissa ei ole kovin hyödyllistä, mutta saamme idean.
// Esimerkki 1.c#sisältää
#sisältää
#sisältää
#sisältää
int main ()
int n;
int filedes [2];
hiilipuskuri [1025];
char * message = "Hei, maailma!";
putki (filedes);
kirjoita (filedes [1], viesti, strlen (viesti));
jos ((n = lue (filedes [0], puskuri, 1024))> = 0)
puskuri [n] = 0; // lopeta merkkijono
printf ("lue% d tavua putkesta:"% s "\ n", n, puskuri);
muu
perror ("lukea");
poistuminen (0);
Tässä olemme ensin luoneet putken putki() sitten kirjoitetaan putkeen käyttäen kalat [1] loppuun. Sitten tiedot on luettu käyttämällä putken toista päätä, joka on filedes [0]. Luimme ja kirjoitimme tiedostoon lukea() ja kirjoittaa() toimintoja.
Esimerkki 2
Tässä esimerkissä näemme, kuinka vanhempien ja lasten prosessit kommunikoivat putken avulla.
// Esimerkki 2.c#sisältää
#sisältää
#sisältää
#sisältää
#sisältää
int main ()
int filedes [2], natavua;
pid_t childpid;
char string [] = "Hei maailma!\ n ";
char readbuffer [80];
putki (filedes);
jos ((lapsen = haarukka ()) == -1)
perror ("haarukka");
poistuminen (1);
jos (lapsi = = 0)
sulje (filedes [0]); // Lapsiprosessi ei tarvitse tätä putken päätä
/ * Lähetä "merkkijono" putken ulostulopuolen läpi * /
kirjoita (filedes [1], merkkijono, (strlen (merkkijono) +1));
poistuminen (0);
muu
/ * Vanhempi prosessi sulkee putken ulostulopuolen * /
sulje (filedes [1]); // Vanhempi prosessi ei tarvitse tätä putken päätä
/ * Lue merkkijono putkesta * /
natavua = lukea (filedes [0], readbuffer, sizeof (readbuffer));
printf ("Lue merkkijono:% s", readbuffer);
paluu (0);
Ensinnäkin yksi putki on luotu käyttämällä putkitoimintoa, sitten lapsiprosessi on haarautunut. Sitten lapsiprosessi sulkee lukupään ja kirjoittaa putkeen. Pääprosessi sulkee kirjoituspään, lukee putkesta ja näyttää sen. Tässä tiedonsiirto on vain yksi tapa lapselta vanhemmalle.
Päätelmä:
putki() on tehokas järjestelmäkutsu Linuxissa. Tässä artikkelissa olemme nähneet vain yksisuuntaisen tiedonkulun, yksi prosessi kirjoittaa ja toinen prosessi lukee, luoden kaksi putkea, voimme saavuttaa myös kaksisuuntaisen tiedonkulun.