Toru on protsesside vahelise suhtluse vahend. Üks protsess kirjutab andmeid torusse ja teine protsess loeb torust andmeid. Selles artiklis näeme, kuidas funktsiooni pipe () kasutatakse kontseptsiooni rakendamiseks C-keele abil.
Pipe kohta
Torus hoitakse andmeid FIFO järjekorras, mis tähendab andmete järjestikku toru ühte otsa kirjutamist ja toru teise otsa andmete järjestikku lugemist.
Kui mõni protsess loeb torust, kuid ükski teine protsess pole veel torusse kirjutatud, tagastab read faili lõpu. Kui protsess soovib torusse kirjutada, kuid toru jaoks pole lugemiseks muud protsessi kinnitatud, siis on see tõrge ja toru genereerib signaali SIGPIPE.
Päisefail
# kaasataSüntaks
int toru (int filedes [2])Argumendid
See funktsioon võtab ühe argumendi, kahe täisarvu massiivi (filedes). filedes [0] kasutatakse torust lugemiseks ja filedes [1] kasutatakse torusse kirjutamiseks. Torust välja lugeda sooviv protsess peaks sulguma filedes [1], ja protsess, mis soovib torusse kirjutada, peaks sulguma filedes [0]. Kui toru mittevajalikud otsad pole sõnaselgelt suletud, ei tagastata faili lõppu (EOF) kunagi.
Tagastage väärtused
Edu saavutamisel on toru () tagastab 0, rikke korral funktsioon -1.
Piltlikult saame esindada toru () toimivad järgmiselt:
Allpool on mõned näited, mis kirjeldavad torufunktsiooni kasutamist C-keeles.
Näide1
Selles näites näeme, kuidas toru funktsioon töötab. Kuigi toru kasutamine ühes protsessis ei ole eriti kasulik, kuid saame idee.
// Näide1.c# kaasata
# kaasata
# kaasata
# kaasata
int main ()
int n;
int filedes [2];
söepuhver [1025];
char * message = "Tere, maailm!";
toru (filedes);
kirjutama (filedes [1], sõnum, strlen (sõnum));
kui ((n = loe (filedes [0], puhver, 1024))> = 0)
puhver [n] = 0; // stringi lõpetamine
printf ("loe torust% d baiti:"% s "\ n", n, puhver);
muud
perror ("loe");
väljumine (0);
Siin oleme kõigepealt loonud toru, kasutades toru () funktsioon kirjutatakse seejärel torule fildid [1] lõpp. Seejärel on andmed loetud toru teise otsa abil, mis on filedes [0]. Faili lugemiseks ja kirjutamiseks kasutasime loe () ja kirjutama () funktsioone.
Näide2
Selles näites näeme, kuidas vanema ja lapse protsessid toru abil suhtlevad.
// Näide2.c# kaasata
# kaasata
# kaasata
# kaasata
# kaasata
int main ()
int filedes [2], nbaiti;
pid_t lastpid;
char string [] = "Tere, maailm!\ n ";
söelugeja [80];
toru (filedes);
kui (((lapsel = kahvel ()) == -1)
perror ("kahvel");
väljapääs (1);
kui (lapsepikk == 0)
sulge (filedes [0]); // Lapseprotsess ei vaja toru seda otsa
/ * Saada "string" toru väljundpoole kaudu * /
kirjutama (filedes [1], string, (strlen (string) +1));
väljumine (0);
muud
/ * Vanemprotsess sulgeb toru väljundpoole * /
sulge (filedes [1]); // Vanemprotsess ei vaja toru seda otsa
/ * Loe torust stringi * /
nbaiti = loetud (filedes [0], readbuffer, sizeof (readbuffer));
printf ("Loe string:% s", readbuffer);
tagasipöördumine (0);
Esiteks on torufunktsiooni abil loodud üks toru, seejärel on lapseprotsess hargnenud. Seejärel sulgeb lapseprotsess loetud otsa ja kirjutab torusse. Vanemprotsess sulgeb kirjutamise lõpu, loeb torust ja kuvab selle. Siin on andmevoog ainult üks viis lapselt vanemale.
Järeldus:
toru () on võimas süsteemikõne Linuxis. Selles artiklis oleme näinud ainult ühesuunalist andmevoogu, üks protsess kirjutab ja teine protsess loeb, luues kaks toru, saame ka kahesuunalise andmevoo.