Sintaksa datoteke cev () funkcija je:
intcev(intpipefd[2]);
Tu funkcija pipe () ustvari enosmerni podatkovni kanal za medprocesno komunikacijo. Greš v an int (Integer) vrsta matrike pipefd sestavljen iz 2 elementov matrike funkcijske cevi (). Nato funkcija pipe () ustvari dva deskriptorja datotek v datoteki pipefd matriko.
Prvi element pipefd matrika, pipefd [0] se uporablja za branje podatkov iz cevi.
Drugi element pipefd matrika, pipefd [1] se uporablja za pisanje podatkov v cev.
Ob uspehu funkcija pipe () vrne 0. Če pride do napake med inicializacijo cevi, potem funkcija pipe () vrne -1.
Funkcija pipe () je definirana v glavi unistd.h . Če želite uporabiti funkcijo pipe () v svojem programu C, morate vključiti glavo unistd.h kot sledi:
#vključi
Za več informacij o sistemski funkciji pipe () preverite stran strani pipe () z naslednjim ukazom:
$ mož2cevMan page of pipe().
Primer 1:
Za prvi primer ustvarite novo izvorno datoteko C. 1_pipe.c in vnesite naslednje vrstice kod.
#vključi#vključi
#vključi
intglavni(nično) {
intpipefds[2];
če(cev(pipefds) == -1) {
perror ('cev');
izhod (EXIT_FAILURE);
}
printf ('Preberi vrednost deskriptorja datoteke: %d n',pipefds[0]);
printf ('Vrednost deskriptorja zapisa datoteke: %d n',pipefds[1]);
vrnitevEXIT_SUCCESS;
}
Tukaj sem vključil datoteko glave pipe () unistd.h najprej z naslednjo vrstico.
#vključiNato v main () funkcijo, definiral sem pipefds dvoelementno celoštevilsko matriko z naslednjo vrstico.
intpipefds[2];Nato sem zagnala funkcijo pipe () za inicializacijo matrike deskriptorjev datotek pipefds kot sledi.
cev(pipefds)Preveril sem tudi napake z uporabo povratne vrednosti funkcije pipe (). Uporabil sem izhod () funkcijo za zaključek programa v primeru okvare cevi.
če(cev(pipefds) == -1) {perror ('cev');
izhod (EXIT_FAILURE);
}
Nato sem natisnil vrednost deskriptorjev datotek cevi za branje in pisanje pipefds [0] in pipefds [1] oz.
printf ('Preberi vrednost deskriptorja datoteke: %d n',pipefds[0]);printf ('Vrednost deskriptorja zapisa datoteke: %d n',pipefds[1]);
Če zaženete program, bi morali videti naslednji izhod. Kot lahko vidite, je vrednost deskriptorja datoteke brane cevi pipefds [0] je 3 in napišite deskriptor datoteke cevi pipefds [1] je 4 .
Primer 2:
Ustvarite drugo izvorno datoteko C. 2_pipe.c in vnesite naslednje vrstice kod.
#vključi#vključi
#vključi
#vključi
intglavni(nično) {
intpipefds[2];
charpufra[5];
če(cev(pipefds) == -1) {
perror ('cev');
izhod (EXIT_FAILURE);
}
char *pin= '4128 0';
printf ('Pisanje PIN -a v cev ... n');
pisati(pipefds[1],pin, 5);
printf ('Končano. n n');
printf ('Branje kode PIN iz cevi ... n');
prebrati(pipefds[0],pufra, 5);
printf ('Končano. n n');
printf ('PIN iz cevi: %s n',pufra);
vrnitevEXIT_SUCCESS;
}
Ta program vam v bistvu prikazuje, kako pisati v cev in brati podatke, ki ste jih zapisali iz pipe.
Tukaj sem shranil 4-mestno kodo PIN v char matriko. Dolžina niza je 5 (vključno z znakom NULL 0).
char *pin= '4128 0';Vsak znak ASCII je velik 1 bajt v C. Torej, če želite poslati 4 -mestno kodo PIN po cevi, morate v cev vnesti 5 bajtov (4 + 1 NULL znak) podatkov.
Za zapis 5 bajtov podatkov ( pin ) v cev, sem uporabil piši () funkcijo z deskriptorjem datoteke write pipe pipefds [1] kot sledi.
pisati(pipefds[1],pin, 5);Zdaj, ko imam nekaj podatkov v cevi, jih lahko preberem iz cevi z uporabo beri () funkcijo v deskriptorju datoteke branja cevi pipefds [0] . Ker sem zapisal 5 bajtov podatkov ( pin ) v cev bom prebral tudi 5 bajtov podatkov iz cevi. Prebrani podatki bodo shranjeni v pufra niz znakov. Ker bom bral 5 bajtov podatkov iz cevi, bo pufra niz znakov mora biti dolg najmanj 5 bajtov.
Določil sem pufra niz znakov na začetku main () funkcijo.
charpufra[5];Zdaj lahko preberem PIN iz cevi in ga shranim v pufra matriko z naslednjo vrstico.
prebrati(pipefds[0],pufra, 5);Ko sem prebral kodo PIN iz cevi, jo lahko natisnem s pomočjo printf () deluje kot običajno.
printf ('PIN iz cevi: %s n',pufra);Ko zaženem program, se prikaže pravilen izhod, kot vidite.
Primer 3:
Ustvarite novo izvorno datoteko C. 3_pipe.c kot vnesite v naslednjih vrsticah kod.
#vključi#vključi
#vključi
#vključi
#vključi
intglavni(nično) {
intpipefds[2];
char *pin;
charpufra[5];
če(cev(pipefds) == -1) {
perror ('cev');
izhod (EXIT_FAILURE);
}
pid_t pid=vilice();
če(pid== 0) { // v otroškem procesu
pin= '4821 0'; // PIN za pošiljanje
blizu(pipefds[0]); // zaprite branje fd
pisati(pipefds[1],pin, 5); // zapiši PIN v cev
printf ('Ustvarjanje kode PIN pri otroku in pošiljanje staršem ... n');
spi(2); // namerna zamuda
izhod (EXIT_SUCCESS);
}
če(pid> 0) { // v glavnem procesu
počakaj(NIČ); // počakajte, da se podrejeni proces konča
blizu(pipefds[1]); // zapiši zapis fd
prebrati(pipefds[0],pufra, 5); // prebere PIN iz pipe
blizu(pipefds[0]); // zaprite branje fd
printf ('Starš je prejel PIN'%s ' n',pufra);
}
vrnitevEXIT_SUCCESS;
}
V tem primeru sem vam pokazal, kako uporabljati cev za medprocesno komunikacijo. PIN sem poslal iz podrejenega procesa v nadrejeni proces z uporabo pipe. Nato preberite kodo PIN iz cevi v nadrejenem procesu in jo natisnite iz nadrejenega procesa.
Najprej sem ustvaril podrejeni proces s funkcijo fork ().
pid_t pid=vilice();Nato v otroškem procesu ( pid == 0 ), Sem PIN zapisal v cev s pomočjo piši () funkcijo.
pisati(pipefds[1],pin, 5);Ko je koda PIN zapisana v cev iz podrejenega procesa, se nadrejeni proces ( pid> 0 ) preberite iz cevi z uporabo beri () funkcijo.
prebrati(pipefds[0],pufra, 5);Nato je nadrejeni postopek natisnil kodo PIN z uporabo printf () deluje kot običajno.
printf ('Starš je prejel PIN'%s ' n',pufra);Kot lahko vidite, zagon programa daje pričakovani rezultat.
Primer 4:
Ustvarite novo izvorno datoteko C. 4_pipe.c kot vnesite v naslednjih vrsticah kod.
#vključi#vključi
#vključi
#vključi
#vključi
#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2
ničnogetPIN(charpin[PIN_LENGTH+ 1]) {
srand (getpid() +getppid());
pin[0] = 49 + vrstici () % 7;
za(intjaz= 1;jaz<PIN_LENGTH;jaz++) {
pin[jaz] = 48 + vrstici () % 7;
}
pin[PIN_LENGTH] = ' 0';
}
intglavni(nično) {
medtem(1) {
intpipefds[2];
charpin[PIN_LENGTH+ 1];
charpufra[PIN_LENGTH+ 1];
cev(pipefds);
pid_t pid=vilice();
če(pid== 0) {
getPIN(pin); // ustvari PIN
blizu(pipefds[0]); // zaprite branje fd
pisati(pipefds[1],pin,PIN_LENGTH+ 1); // zapiši PIN v cev
printf ('Ustvarjanje kode PIN pri otroku in pošiljanje staršem ... n');
spi(PIN_WAIT_INTERVAL); // namerno zamuja pri ustvarjanju PIN -a.
izhod (EXIT_SUCCESS);
}
če(pid> 0) {
počakaj(NIČ); // čakanje, da otrok konča
blizu(pipefds[1]); // zapiši zapis fd
prebrati(pipefds[0],pufra,PIN_LENGTH+ 1); // prebere PIN iz pipe
blizu(pipefds[0]); // zaprite branje fd
printf ('Starš je od otroka prejel PIN'%s '. n n',pufra);
}
}
vrnitevEXIT_SUCCESS;
}
Ta primer je enak Primer 3 . Edina razlika je v tem, da ta program nenehno ustvarja podrejeni proces, generira kodo PIN v podrejenem procesu in pošlje PIN v nadrejeni proces s pomočjo kanala.
Nadrejeni proces nato prebere kodo PIN iz cevi in jo natisne.
Ta program vsakih PIN_WAIT_INTERVAL sekund ustvari novo kodo PIN_LENGTH.
Kot lahko vidite, program deluje po pričakovanjih.
Program lahko ustavite samo s pritiskom na + C .
Torej, tako uporabljate sistemski klic pipe () v programskem jeziku C. Hvala, ker ste prebrali ta članek.