Kuidas kasutada torufunktsiooni C keeles

How Use Pipe Function C Language



Toru on protsesside vahelise suhtluse vahend. Üks protsess kirjutab andmed torusse ja teine ​​protsess torust. Selles artiklis näeme, kuidas funktsiooni pipe () kasutatakse kontseptsiooni rakendamiseks C -keelt kasutades.

Pipe kohta

Torus hoitakse andmeid FIFO järjekorras, mis tähendab andmete kirjutamist toru ühte otsa järjestikku ja andmete lugemist toru teisest otsast samas järjestuses.







Kui mõni protsess loeb torust, kuid ükski teine ​​protsess pole torule veel kirjutanud, tagastab lugemine faili lõppu. Kui protsess soovib torule kirjutada, kuid torule pole lugemiseks muud protsessi lisatud, on see tõrketeade ja toru genereerib SIGPIPE signaali.



Päisefail

#kaasake

Süntaks



inttoru(intfailid[2])

Argumendid

See funktsioon võtab ühe argumendi, kahe täisarvu massiivi ( failid ). failid [0] kasutatakse torust lugemiseks ja failid [1] kasutatakse torusse kirjutamiseks. Protsess, mis soovib torust lugeda, peaks sulguma failid [1], ja protsess, mis soovib torule kirjutada, peaks lõppema failid [0] . Kui toru mittevajalikud otsad pole selgesõnaliselt suletud, ei tagastata faili lõppu (EOF) kunagi.





Tagastab väärtused

Edu kohta, toru () tagastab 0, ebaõnnestumise korral tagastab funktsioon -1.

Piltlikult võime esindada toru () toimida järgmiselt:



Allpool on mõned näited, mis kirjeldavad torufunktsiooni kasutamist C keeles.

Näide1

Selles näites näeme, kuidas torufunktsioon töötab. Kuigi toru kasutamine ühes protsessis ei ole väga kasulik, saame siiski idee.

// Näide1.c
#kaasake
#kaasake
#kaasake
#kaasake

intpeamine()
{
intn;
intfailid[2];
süsipuhver[1025];
süsi *sõnum= 'Tere, Maailm!';

toru(failid);
kirjutada(failid[1],sõnum, strlen (sõnum));

kui ((n=loe(failid[0],puhver, 1024 ) ) > = 0) {
puhver[n] = 0; // lõpetada string
printf ('loe torust %d baiti:'%s' n',n,puhver);
}
muidu
eksitus ('loe');
väljumine (0);
}

Siin oleme esmalt loonud toru, kasutades toru () funktsioon kirjutatakse seejärel torule elevandiluust [1] lõpp. Seejärel on andmeid loetud toru teise otsa abil, mis on failid [0] . Faili lugemiseks ja kirjutamiseks kasutasime seda loe () ja kirjuta () funktsioone.

Näide2

Selles näites näeme, kuidas vanema ja lapse protsessid suhtlevad toru abil.

// Näide2.c
#kaasake
#kaasake
#kaasake
#kaasake
#kaasake

intpeamine()
{
intfailid[2],nbaiti;
pid_t lapsik;
süsistring[] = 'Tere, Maailm! n';
süsilugemispuhver[80];

toru(failid);

kui((lapsik=kahvel()) == -1)
{
eksitus ('kahvel');
väljumine (1);
}

kui(lapsik== 0)
{
Sulge(failid[0]);// Lapseprotsess ei vaja seda toru otsa

/ * Saatke 'string' toru väljundkülje kaudu */
kirjutada(failid[1],string, ( strlen (string)+1));
väljumine (0);
}
muidu
{
/ * Vanemprotsess sulgeb toru väljundkülje */
Sulge(failid[1]);// Vanemprotsess ei vaja seda toru otsa

/ * Loe torust stringina */
nbaiti=loe(failid[0],lugemispuhver, suurus(lugemispuhver));
printf ('Loe stringi: %s',lugemispuhver);
}

tagasi(0);
}

Esiteks on torufunktsiooni abil loodud üks toru, seejärel on hargnenud alamprotsess. Seejärel sulgeb lapsprotsess lugemisotsa ja kirjutab torule. Vanemprotsess sulgeb kirjutamisotsa ja loeb torust ning 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 saavutada ka kahesuunalise andmevoo.