Lula je medij za komunikaciju između procesa. Jedan postupak zapisuje podatke u cijev, a drugi postupak čita podatke iz cijevi. U ovom ćemo članku vidjeti kako se funkcija pipe () koristi za provedbu koncepta pomoću jezika C.
O cijevi
U cijevi se podaci održavaju u FIFO redoslijedu, što znači sekvencijalno upisivanje podataka na jedan kraj cijevi i čitanje podataka s drugog kraja cijevi istim sekvencijalnim redoslijedom.
Ako bilo koji postupak čita iz cijevi, ali niti jedan drugi postupak još nije upisao u cijev, tada read vraća kraj datoteke. Ako postupak želi upisati u cijev, ali na cijev nije priključen nijedan drugi postupak za čitanje, to je uvjet pogreške i cijev generira SIGPIPE signal.
Datoteka zaglavlja
#includeSintaksa
cijev int (int datoteke (2))Argumenti
Ova funkcija uzima jedan argument, niz od dvije cijele brojke (polja). polja [0] koristi se za očitavanje iz cijevi, i polja [1] koristi se za upisivanje u cijev. Postupak koji želi čitati iz cijevi trebao bi se zatvoriti polja [1], a postupak koji želi upisati u cijev trebao bi se zatvoriti polja [0]. Ako nepotrebni krajevi cijevi nisu izričito zatvoreni, kraj datoteke (EOF) nikada se neće vratiti.
Vrati vrijednosti
O uspjehu, cijev() vraća 0, u slučaju neuspjeha funkcija vraća -1.
Slikovito možemo predstaviti cijev() funkcioniraju na sljedeći način:
Ispod je nekoliko primjera koji prikazuju kako koristiti funkciju pipe u jeziku C.
Primjer1
U ovom ćemo primjeru vidjeti kako funkcionira funkcija cijevi. Iako korištenje cijevi u jednom procesu nije jako korisno, ali dobit ćemo ideju.
// Primjer1.c#include
#include
#include
#include
int main ()
int n;
int podneseni [2];
pufer za char [1025];
char * message = "Zdravo, World!";
cijev (filca);
pisanje (polja (1), poruka, strlen (poruka));
if ((n = čitanje (polja (0), međuspremnik, 1024))> = 0)
međuspremnik [n] = 0; // završava niz
printf ("pročitati% d bajta iz cijevi:"% s "\ n", n, međuspremnik);
drugo
perror ("čitati");
izlaz (0);
Ovdje smo prvo stvorili cijev pomoću cijev() funkcija koja se zatim zapisuje u cijev pomoću fildes [1] kraj. Zatim su podaci pročitani s drugog kraja cijevi, što je polja [0]. Nekad smo čitali i pisali u datoteku čitati() i pisati() funkcije.
Primjer2
U ovom ćemo primjeru vidjeti kako roditeljski i podređeni procesi komuniciraju pomoću cijevi.
// Primjer2.c#include
#include
#include
#include
#include
int main ()
int datoteke, [2], nbajta;
pid_t dijete;
char string [] = "Zdravo, svijete!\ n ";
char readbuffer [80];
cijev (filca);
if ((childpid = fork ()) == -1)
perror ("vilica");
izlaz (1);
ako (childpid == 0)
close (сервер [0]); // Podređenom procesu ovaj kraj cijevi nije potreban
/ * Pošaljite "niz" kroz izlaznu stranu cijevi * /
zapisivanje (polja [1], niz, (strlen (niz) +1));
izlaz (0);
drugo
/ * Nadređeni postupak zatvara izlaznu stranu cijevi * /
close (сервер [1]); // Matičnom procesu ovaj kraj cijevi nije potreban
/ * Očitati u nizu iz cijevi * /
nbytes = čitano (datoteke, [0], spremnik za čitanje, veličina (spremnik za čitanje));
printf ("Čitanje niza:% s", međuspremnik);
povratak (0);
Prvo je stvorena jedna cijev pomoću funkcije cijevi, a potom je podrezan proces. Zatim, podređeni proces zatvara kraj čitanja i piše u cijev. Nadređeni postupak zatvara kraj pisanja i čita iz cijevi i prikazuje ga. Ovdje je protok podataka samo jedan način od djeteta do roditelja.
Zaključak:
cijev() je moćan sistemski poziv u Linuxu. U ovom smo članku vidjeli samo jednosmjerni tok podataka, jedan proces zapisuje, a drugi čita, stvarajući dvije cijevi kojima također možemo postići dvosmjerni protok podataka.