C programavimas

Kaip naudotis vamzdžių funkcija C kalba

Kaip naudotis vamzdžių funkcija C kalba

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

Apie „Pipe“

Vamzdyje duomenys palaikomi FIFO tvarka, o tai reiškia nuosekliai rašyti duomenis į vieną vamzdžio galą ir skaityti duomenis iš kito vamzdžio galo ta pačia eilės tvarka.

Jei kuris nors procesas nuskaitomas iš vamzdžio, bet joks kitas procesas dar nėra parašytas, tada skaitymas grąžina failo pabaigą. Jei procesas nori rašyti į vamzdį, bet nėra kito proceso, pritvirtinto prie vamzdžio, kad būtų galima skaityti, tai yra klaida ir vamzdis generuoja SIGPIPE signalą.

Antraštės failas

# įtraukti

Sintaksė

int vamzdis (int filedes [2])

Argumentai

Šiai funkcijai reikalingas vienas argumentas, dviejų sveikųjų skaičių masyvas (filedes). filedes [0] yra naudojamas skaitant iš pypkės ir filedes [1] naudojamas rašant į pypkę. Procesas, norintis skaityti iš vamzdžio, turėtų būti baigtas filedes [1], ir procesas, kuris nori rašyti į vamzdį, turėtų būti baigtas filedes [0].  Jei nereikalingi vamzdžio galai nėra aiškiai uždaryti, failo pabaiga (EOF) niekada nebus grąžinta.

Grąžinimo vertės

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

Paveikslėlyje mes galime atstovauti vamzdis () veikia taip:

Toliau 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, bet mes gausime idėją.

// 1 pavyzdys.c
# įtraukti
# įtraukti
# įtraukti
# įtraukti
int main ()

int n;
int filedes [2];
char buferis [1025];
char * message = "Sveiki, pasauli!";
vamzdis (filedes);
rašyti (filedes [1], žinutė, strlen (žinutė));
jei ((n = skaityti (filedes [0], buferis, 1024))> = 0)
buferis [n] = 0; // nutraukti eilutę
printf ("perskaitykite% d baitus iš vamzdžio:"% s "\ n", n, buferis);

Kitas
perror („skaityti“);
išėjimas (0);

Čia mes pirmiausia sukūrėme vamzdį naudodami vamzdis () funkcija, tada užrašoma į vamzdį naudojant fildės [1] galas. Tada duomenys buvo nuskaityti naudojant kitą vamzdžio galą, kuris yra filedes [0]. Norėdami skaityti ir rašyti į bylą, mes įpratome skaityti () ir rašyti () funkcijos.

2 pavyzdys

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

// 2 pavyzdys.c
# įtraukti
# įtraukti
# įtraukti
# įtraukti
# įtraukti
int main ()

int filedes [2], nbaitai;
pid_t childpid;
char string [] = "Sveiki, pasauli!\ n ";
char skaitytuvas [80];
vamzdis (filedes);
jei (((vaikiškas = šakutė ()) == -1)

perror ("šakutė");
išėjimas (1);

jei (childpid == 0)

uždaryti (filedes [0]); // Vaiko procesui nereikia šio vamzdžio galo
/ * Siųskite „virvelę“ per vamzdžio išvesties pusę * /
rašyti (filedes [1], string, (strlen (string) +1));
išėjimas (0);

Kitas

/ * Pirminis procesas uždaro vamzdžio išvesties pusę * /
uždaryti (filedes [1]); // Pirminiam procesui šio vamzdžio galo nereikia
/ * Skaityti eilute iš pypkės * /
nbaitai = skaityti (filedes [0], readbuffer, sizeof (readbuffer));
printf ("Skaityti eilutę:% s", skaitymo buferis);

grįžti (0);

Pirma, naudojant vamzdžio funkciją buvo sukurtas vienas vamzdis, tada buvo sukurtas vaiko procesas. Tada vaiko procesas uždaro skaitymo galą ir rašo į pypkę. Pirminis procesas uždaro rašymo pabaigą, perskaito iš vamzdžio ir ją parodo. Čia duomenų srautas yra tik vienas iš būdų iš vaiko į tėvus.

Išvada:

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

Kaip naudoti „GameConqueror Cheat Engine“ sistemoje „Linux“
Straipsnyje pateikiamas „GameConqueror“ apgaulės variklio naudojimo „Linux“ vadove. Daugelis žaidėjų, žaidžiančių sistemoje „Windows“, dažnai naudoja ...
Geriausi „Linux“ žaidimų konsolių emuliatoriai
Šiame straipsnyje bus išvardyta populiari žaidimų konsolių emuliavimo programinė įranga, skirta „Linux“. „Emuliacija“ yra programinės įrangos suderina...
Geriausi „Linux“ žaidimų distristai 2021 m
„Linux“ operacinė sistema nuėjo ilgą kelią nuo originalios, paprastos, serverio išvaizdos. Ši OS pastaraisiais metais nepaprastai patobulėjo ir dabar ...