Kaip naudotis vamzdžio funkcija C kalba

How Use Pipe Function C Language



Vamzdis yra terpė komunikacijai tarp procesų. Vienas procesas įrašo duomenis į vamzdį, o kitas - nuskaito duomenis iš vamzdžio. Šiame straipsnyje pamatysime, kaip funkcija pipe () naudojama koncepcijai įgyvendinti naudojant C kalbą.

Apie Pipe

Vamzdyje duomenys saugomi FIFO tvarka, o tai reiškia, kad duomenys įrašomi į vieną vamzdžio galą iš eilės ir skaitomi iš kito vamzdžio galo ta pačia eilės tvarka.







Jei kuris nors procesas nuskaitomas iš vamzdžio, bet joks kitas procesas dar nebuvo parašytas, tada skaitymas grąžina failo pabaigą. Jei procesas nori įrašyti į vamzdį, bet prie vamzdžio nėra pridėtas kitas procesas skaitymui, tai yra klaidos būklė ir vamzdis generuoja SIGPIPE signalą.



Antraštės failas

#įtraukti

Sintaksė



tarptvamzdis(tarptfailai[2])

Argumentai

Ši funkcija naudoja vieną argumentą, dviejų sveikų skaičių masyvą ( failai ). failai [0] naudojamas skaitymui iš vamzdžio ir failai [1] naudojamas rašyti į vamzdį. Procesas, kurį norima nuskaityti iš vamzdžio, turėtų būti uždarytas failai [1], ir procesas, kurį norima įrašyti į vamzdį, turėtų būti baigtas failai [0] . Jei nereikalingi vamzdžio galai nėra aiškiai uždaryti, failo pabaiga (EOF) niekada nebus grąžinta.





Grąžinti vertes

Dėl sėkmės ,. vamzdis () grąžina 0, nesėkmės atveju funkcija grąžina -1.

Vaizdiškai galime atstovauti vamzdis () veikia taip:



Žemiau pateikiami keli pavyzdžiai, vaizduojantys, kaip naudoti vamzdžio funkciją C kalba.

1 pavyzdys

Šiame pavyzdyje pamatysime, kaip veikia vamzdžio funkcija. Nors vamzdžio naudojimas viename procese nėra labai naudingas, tačiau mes susidursime su idėja.

// Pavyzdys1.c
#įtraukti
#įtraukti
#įtraukti
#įtraukti

tarptpagrindinis()
{
tarptn;
tarptfailai[2];
anglisbuferis[1025];
anglis *pranešimą= 'Labas pasauli!';

vamzdis(failai);
rašyti(failai[1],pranešimą, strlenas (pranešimą));

jei ((n=skaityti(failai[0],buferis, 1024 ) ) > = 0) {
buferis[n] = 0; // nutraukti eilutę
printf ('perskaityk %d baitą iš vamzdžio:'%s' n',n,buferis);
}
Kitas
perror ('skaityti');
išeiti (0);
}

Čia pirmiausia sukūrėme vamzdį naudodami vamzdis () funkcija įrašoma į vamzdį naudojant dramblio kaulo [1] galas. Tada duomenys buvo nuskaityti naudojant kitą vamzdžio galą, kuris yra failai [0] . Skaitydami ir rašydami į failą mes anksčiau skaityti () ir rašyti () funkcijas.

2 pavyzdys

Šiame pavyzdyje pamatysime, kaip tėvų ir vaikų procesai bendrauja naudojant vamzdį.

// Pavyzdys2.c
#įtraukti
#įtraukti
#įtraukti
#įtraukti
#įtraukti

tarptpagrindinis()
{
tarptfailai[2],nbaitų;
pid_t vaikas;
angliseilutė[] = 'Labas pasauli! n';
anglisskaitymo buferis[80];

vamzdis(failai);

jei((vaikiškas=šakutė()) == -1)
{
perror („šakutė“);
išeiti (1);
}

jei(vaikiškas== 0)
{
Uždaryti(failai[0]);// Vaiko procesui nereikia šio vamzdžio galo

/ * Siųsti „eilutę“ per vamzdžio išvesties pusę */
rašyti(failai[1],eilutė, ( strlenas (eilutė)+1));
išeiti (0);
}
Kitas
{
/ * Pagrindinis procesas uždaro vamzdžio išėjimo pusę */
Uždaryti(failai[1]);// Pagrindiniam procesui nereikia šio vamzdžio galo

/ * Skaitykite eilute iš vamzdžio */
nbaitų=skaityti(failai[0],skaitymo buferis, dydis(skaitymo buferis));
printf ('Skaityti eilutę: %s',skaitymo buferis);
}

grįžti(0);
}

Pirma, vienas vamzdis buvo sukurtas naudojant vamzdžio funkciją, tada buvo pašalintas vaiko procesas. Tada vaiko procesas uždaro skaitymo pabaigą ir rašo į vamzdį. Pirminis procesas uždaro rašymo pabaigą, skaito iš vamzdžio ir jį parodo. Čia duomenų srautas yra tik vienas būdas, kuris yra nuo vaiko iki tėvų.

Išvada:

vamzdis () yra galingas sistemos skambutis „Linux“. Šiame straipsnyje mes matėme tik vienpusį duomenų srautą, vienas procesas rašo, o kitas procesas skaito, sukurdami du vamzdžius, taip pat galime pasiekti dviejų krypčių duomenų srautą.