Cev je medij za komunikacijo med procesi. En postopek zapiše podatke v cev, drugi proces pa podatke iz cevi. V tem članku bomo videli, kako se funkcija pipe () uporablja za izvajanje koncepta z uporabo jezika C.
Glede Pipe
V kanalu se podatki vzdržujejo v vrstnem redu FIFO, kar pomeni, da podatke zaporedoma zapisujemo na en konec cevi in v istem zaporedju beremo podatke z drugega konca cevi.
Če kateri koli proces bere iz cevi, vendar noben drug postopek še ni zapisan v cev, potem branje vrne konec datoteke. Če proces želi zapisati v cev, vendar na cev ni pritrjen noben drug postopek za branje, je to stanje napake in cev ustvari signal SIGPIPE.
Datoteka z glavo
#vključiSintaksa
intcev(intvložniki[2])
Argumenti
Ta funkcija vzame en sam argument, niz dveh celih števil ( vložniki ). vložniki [0] se uporablja za branje iz cevi in vložniki [1] se uporablja za pisanje v cev. Postopek, ki ga želite prebrati iz cevi, se mora zapreti vložniki [1], in postopek, ki želi zapisati v cev, se mora zapreti vložniki [0] . Če nepotrebni konci cevi niso izrecno zaprti, se konec datoteke (EOF) nikoli ne vrne.
Vrnjene vrednosti
O uspehu, cev () vrne 0, v primeru napake funkcija vrne -1.
Slikovno lahko predstavljamo cev () deluje na naslednji način:
Spodaj je nekaj primerov, ki prikazujejo uporabo funkcije pipe v jeziku C.
Primer 1
V tem primeru bomo videli, kako deluje funkcija cevi. Čeprav uporaba cevi v enem samem procesu ni zelo uporabna, bomo dobili idejo.
// Primer1.c#vključi
#vključi
#vključi
#vključi
intglavni()
{
intn;
intvložniki[2];
charpufra[1025];
char *sporočilo= 'Pozdravljen, svet!';
cev(vložniki);
pisati(vložniki[1],sporočilo, strlen (sporočilo));
če ((n=prebrati(vložniki[0],pufra, 1024 ) ) > = 0) {
pufra[n] = 0; // prekinimo niz
printf ('preberi %d bajtov iz cevi:'%s' n',n,pufra);
}
drugače
perror ('beri');
izhod (0);
}
Tu smo najprej ustvarili cev z uporabo cev () funkcijo nato zapišete v cev z uporabo slonovina [1] konec. Nato so bili podatki prebrani z drugim koncem cevi, kar je vložniki [0] . Za branje in pisanje v datoteko smo včasih beri () in piši () funkcije.
Primer 2
V tem primeru bomo videli, kako starševski in podrejeni proces komunicirata z uporabo cevi.
// Primer2.c#vključi
#vključi
#vključi
#vključi
#vključi
intglavni()
{
intvložniki[2],nbajtov;
pid_t otroški;
charvrvica[] = 'Pozdravljen, svet! n';
charreadbuffer[80];
cev(vložniki);
če((otroški=vilice()) == -1)
{
perror ('vilica');
izhod (1);
}
če(otroški== 0)
{
blizu(vložniki[0]);// Otroški proces ne potrebuje tega konca cevi
/ * Pošlji 'niz' skozi izhodno stran cevi */
pisati(vložniki[1],vrvica, ( strlen (vrvica)+1));
izhod (0);
}
drugače
{
/ * Nadrejeni proces zapre izhodno stran cevi */
blizu(vložniki[1]);// Starševski postopek ne potrebuje tega konca cevi
/ * Preberi v nizu iz cevi */
nbajtov=prebrati(vložniki[0],readbuffer, velikostof(readbuffer));
printf ('Preberi niz: %s',readbuffer);
}
vrnitev(0);
}
Najprej je bila s funkcijo pipe ustvarjena ena cev, nato pa je bil razcepljen podrejeni proces. Nato otroški proces zapre prebrani konec in zapiše v cev. Nadrejeni proces zapre konec pisanja in bere iz cevi ter ga prikaže. Tu je tok podatkov le en način, ki je od otroka do starša.
Zaključek:
cev () je močan sistemski klic v Linuxu. V tem članku smo videli samo enosmerni tok podatkov, en proces piše, drugi proces pa bere, kar ustvarja dve cevi, ki jih lahko dosežemo tudi v dvosmernem toku podatkov.