Kako uporabljati funkcijo pipe v jeziku C

How Use Pipe Function C Language



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či

Sintaksa



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.