Cev je medij za komunikacijo med procesi. En postopek zapisuje podatke v cev, drugi postopek pa podatke iz cevi. V tem članku bomo videli, kako se funkcija pipe () uporablja za izvajanje koncepta v jeziku C.
O cevi
V cevi se podatki vzdržujejo v vrstnem redu FIFO, kar pomeni zaporedno zapisovanje podatkov na en konec cevi in branje podatkov z drugega konca cevi v enakem zaporednem vrstnem redu.
Če kateri koli postopek bere iz cevi, vendar noben drug postopek še ni zapisal v cev, potem branje vrne konec datoteke. Če želi postopek zapisati v cev, vendar na cev ni pripet drug postopek za branje, je to stanje napake in cev generira signal SIGPIPE.
Datoteka glave
#includeSintaksa
cev int (datoteke int [2])Argumenti
Ta funkcija sprejme en argument, matriko dveh celih števil (vložniki). vložniki [0] se uporablja za odčitavanje iz cevi in vložniki [1] se uporablja za zapisovanje v cev. Proces, ki ga želimo brati iz cevi, bi se moral zaključiti vložniki [1], in postopek, ki želi zapisovati v cev, bi se moral zaključiti vložniki [0]. Če nepotrebni konci cevi niso izrecno zaprti, konec datoteke (EOF) ne bo nikoli vrnjen.
Vrnite vrednosti
O uspehu, cev () vrne 0, v primeru okvare funkcija vrne -1.
Slikovno lahko predstavljamo cev () deluje na naslednji način:
Spodaj je nekaj primerov, ki prikazujejo, kako uporabljati funkcijo pipe v jeziku C.
Primer1
V tem primeru bomo videli, kako deluje funkcija cevi. Čeprav uporaba cevi v enem samem postopku ni zelo koristna, bomo pa dobili idejo.
// Primer1.c#include
#include
#include
#include
int main ()
int n;
int vložniki [2];
medpomnilnik char [1025];
char * message = "Pozdravljen, svet!";
cev (vložki);
pisanje (polja [1], sporočilo, strlen (sporočilo));
če ((n = prebrano (vložene datoteke [0], medpomnilnik, 1024))> = 0)
medpomnilnik [n] = 0; // zaključi niz
printf ("preberi% d bajtov iz cevi:"% s "\ n", n, medpomnilnik);
drugače
perror ("branje");
izhod (0);
Tu smo najprej ustvarili cev z uporabo cev () funkcija, ki je nato zapisana v cev z uporabo fildes [1] konec. Nato so bili podatki prebrani z drugim koncem cevi, kar je vložniki [0]. Včasih smo brali in pisali v datoteko preberi () in piši () funkcije.
Primer2
V tem primeru bomo videli, kako nadrejeni in podrejeni procesi komunicirajo s pomočjo cevi.
// Primer2.c#include
#include
#include
#include
#include
int main ()
int datoteke [2], nbajtov;
pid_t otrok;
char string [] = "Pozdravljen, svet!\ n ";
char bralnik [80];
cev (vložki);
če ((childpid = fork ()) == -1)
perror ("vilice");
izhod (1);
če (Childpid == 0)
close (filedes [0]); // Podrejeni postopek ne potrebuje tega konca cevi
/ * Pošlji "niz" skozi izhodno stran cevi * /
pisanje (polja [1], niz, (strlen (niz) +1));
izhod (0);
drugače
/ * Nadrejeni postopek zapre izhodno stran cevi * /
close (filedes [1]); // Nadrejeni postopek ne potrebuje tega konca cevi
/ * Preberi v niz iz cevi * /
nbajtov = prebrano (vloženi elementi [0], medpomnilnik, velikost (bralnik));
printf ("Preberi niz:% s", medpomnilnik);
vrnitev (0);
Najprej je bila ustvarjena ena cev s funkcijo cevi, nato pa je podrejen proces. Nato podrejeni postopek zapre konec branja in zapiše v cev. Nadrejeni postopek zapre konec pisanja, bere iz cevi in ga prikaže. Tukaj je pretok podatkov le en način, od otroka do starša.
Zaključek:
cev () je močan sistemski klic v Linuxu. V tem članku smo videli samo enosmerni pretok podatkov, en postopek zapisuje, drugi postopek pa bere in ustvarja dve cevi, s katerimi lahko dosežemo tudi dvosmerni tok.