Kako koristiti funkciju cijevi u jeziku C

How Use Pipe Function C Language



Cijev je medij za komunikaciju između procesa. Jedan proces zapisuje podatke u cijev, a drugi proces čita podatke iz cijevi. U ovom članku ćemo vidjeti kako se funkcija pipe () koristi za implementaciju koncepta pomoću jezika C.

O Pipeu

U cijevi se podaci održavaju u FIFO redoslijedu, što znači zapisivanje podataka na jedan kraj cijevi uzastopno i čitanje podataka s drugog kraja cijevi istim slijednim redoslijedom.







Ako bilo koji proces čita iz cijevi, ali nijedan drugi proces još nije zapisao u cijev, tada čitanje vraća kraj datoteke. Ako proces želi pisati u cijev, ali na cijev nije priključen drugi proces za čitanje, to je uvjet pogreške, a cijev generira SIGPIPE signal.



Zaglavna datoteka

#uključi

Sintaksa



intcijev(intpodnositelji zahtjeva[2])

Argumenti

Ova funkcija uzima jedan argument, niz od dva cijela broja ( podnositelji zahtjeva ). polja [0] koristi se za čitanje iz cijevi, i polja [1] služi za pisanje u cijev. Proces koji se želi čitati iz cijevi trebao bi se zatvoriti polja [1], a proces koji se želi zapisati u cijev trebao bi se zatvoriti polja [0] . Ako nepotrebni krajevi cijevi nisu izričito zatvoreni, tada se kraj datoteke (EOF) nikada neće vratiti.





Povratne vrijednosti

O uspjehu, cijev() vraća 0, za neuspjeh funkcija vraća -1.

Slikovito možemo predstaviti cijev() funkcioniraju na sljedeći način:



Dolje je nekoliko primjera koji prikazuju kako koristiti funkciju cijevi u jeziku C.

Primjer 1

U ovom primjeru vidjet ćemo kako funkcionira funkcija cijevi. Iako korištenje cijevi u jednom procesu nije jako korisno, dobit ćemo ideju.

// Primjer1.c
#uključi
#uključi
#uključi
#uključi

intglavni()
{
intn;
intpodnositelji zahtjeva[2];
charpufer[1025];
char *poruka= 'Pozdrav svijete!';

cijev(podnositelji zahtjeva);
pisati(podnositelji zahtjeva[1],poruka, strlen (poruka));

ako ((n=čitati(podnositelji zahtjeva[0],pufer, 1024 ) ) > = 0) {
pufer[n] = 0; // završava niz
printf ('očitavanje %d bajta iz cijevi:'%s' n',n,pufer);
}
drugo
perror ('čitati');
Izlaz (0);
}

Ovdje smo prvi put stvorili cijev pomoću cijev() funkcija zatim zapisana u cijev pomoću slonovača [1] kraj. Zatim su podaci pročitani pomoću drugog kraja cijevi, što je polja [0] . Za čitanje i pisanje u datoteku, nekad smo čitati() i pisati() funkcije.

Primjer 2

U ovom primjeru vidjet ćemo kako procesi roditelja i djeteta komuniciraju pomoću cijevi.

// Primjer2.c
#uključi
#uključi
#uključi
#uključi
#uključi

intglavni()
{
intpodnositelji zahtjeva[2],nbajta;
pid_t dječji;
charniz[] = 'Pozdrav svijete! n';
charmeđuspremnik za čitanje[80];

cijev(podnositelji zahtjeva);

ako((djetinjast=vilica()) == -1)
{
perror ('vilica');
Izlaz (1);
}

ako(djetinjast== 0)
{
Zatvoriti(podnositelji zahtjeva[0]);// Podređeni proces ne treba ovaj kraj cijevi

/ * Pošaljite 'niz' kroz izlaznu stranu cijevi */
pisati(podnositelji zahtjeva[1],niz, ( strlen (niz)+1));
Izlaz (0);
}
drugo
{
/ * Nadređeni proces zatvara izlaznu stranu cijevi */
Zatvoriti(podnositelji zahtjeva[1]);// Roditeljskom procesu nije potreban ovaj kraj cijevi

/ * Očitavanje u nizu iz cijevi */
nbajta=čitati(podnositelji zahtjeva[0],međuspremnik za čitanje, veličina(međuspremnik za čitanje));
printf ('Čitanje niza: %s',međuspremnik za čitanje);
}

povratak(0);
}

Prvo je jedna cijev stvorena pomoću funkcije cijevi, a zatim je podvojeni proces račvan. Zatim, podređeni proces zatvara kraj čitanja i zapisuje u cijev. Roditeljski proces zatvara kraj za pisanje i čita iz cijevi te ga prikazuje. Ovdje je protok podataka samo jedan način od djeteta do roditelja.

Zaključak:

cijev() snažan je sistemski poziv u Linuxu. U ovom članku vidjeli smo samo jednosmjerni protok podataka, jedan proces zapisuje, a drugi proces čita, stvarajući dvije cijevi koje možemo postići i dvosmjernim protokom podataka.