Vse o cevi () Funkcija:
Sintaksa cev () funkcija je:
cev int (int pipefd [2]);Tu funkcija pipe () ustvari enosmerni podatkovni kanal za medprocesno komunikacijo. Vstopite v int Matrika tipa (Integer) pipefd sestavljen iz 2 elementa matrike v funkcijsko cev (). Nato funkcija pipe () ustvari dva deskriptorja datotek v datoteki pipefd matriko.
Prvi element pipefd matriko, pipefd [0] se uporablja za branje podatkov iz cevi.
Drugi element pipefd matriko, pipefd [1] se uporablja za zapisovanje podatkov v cev.
Po 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 v svojem programu C uporabljati funkcijo pipe (), morate vključiti glavo unistd.h kot sledi:
#includeČe želite več informacij o sistemski funkciji pipe (), preverite man stran pipe () z naslednjim ukazom:
$ man 2 cevPriročnik strani pipe ().
Primer 1:
Za prvi primer ustvarite novo izvorno datoteko C 1_pipe.c in vnesite naslednje vrstice kod.
#include#include
#include
int main (void)
int pipefds [2];
če (cev (pipefds) == -1)
perror ("cev");
izhod (EXIT_FAILURE);
printf ("Vrednost branja deskriptorja datoteke:% d \ n", pipefds [0]);
printf ("Vpiši vrednost opisnika datoteke:% d \ n", pipefds [1]);
vrni EXIT_SUCCESS;
Tu sem vključil glavo datoteke pipe () unistd.h najprej z naslednjo vrstico.
#includeNato v glavni () funkcijo, sem definiral pipefds dvocelična celoštevilska matrika z naslednjo vrstico.
int pipefds [2];Nato sem zagnal funkcijo pipe () za inicializacijo polja deskriptorjev datotek pipefds kot sledi.
cev (pipefds)Preveril sem tudi napake z uporabo vrnjene vrednosti funkcije pipe (). Uporabil sem izhod () funkcijo za končanje programa v primeru, da funkcija cevi odpove.
če (cev (pipefds) == -1)perror ("cev");
izhod (EXIT_FAILURE);
Nato sem natisnil vrednost deskriptorjev datotek za branje in pisanje cevi pipefds [0] in pipefds [1] oz.
printf ("Vrednost branja deskriptorja datoteke:% d \ n", pipefds [0]);printf ("Vpiši vrednost opisnika datoteke:% d \ n", pipefds [1]);
Če zaženete program, bi morali videti naslednji izhod. Kot lahko vidite, je vrednost deskriptorja datoteke prebrane cevi pipefds [0] je 3 in napišite deskriptor datoteke pipe pipefds [1] je 4.
2. primer:
Ustvarite drugo izvorno datoteko C 2_pipe.c in vnesite naslednje vrstice kod.
#include#include
#include
#include
int main (void)
int pipefds [2];
medpomnilnik char [5];
če (cev (pipefds) == -1)
perror ("cev");
izhod (EXIT_FAILURE);
char * pin = "4128 \ 0";
printf ("Zapisovanje kode PIN v cev ... \ n");
pisanje (pipefds [1], pin, 5);
printf ("Končano.\ n \ n ");
printf ("Branje kode PIN iz cevi… \ n");
branje (pipefds [0], medpomnilnik, 5);
printf ("Končano.\ n \ n ");
printf ("PIN iz cevi:% s \ n", medpomnilnik);
vrni EXIT_SUCCESS;
Ta program vam v bistvu pokaže, kako zapisati v cev in prebrati podatke, ki ste jih zapisali iz cevi.
Tu sem shranil 4-mestno kodo PIN v char matriko. Dolžina polja je 5 (vključno z znakom NULL \ 0).
char * pin = "4128 \ 0";Vsak znak ASCII je v C velik 1 bajt. Torej, če želite poslati 4-mestno kodo PIN skozi cev, morate v cev zapisati 5 bajtov (4 + 1 NULL znak) podatkov.
Če želite zapisati 5 bajtov podatkov (pin) v cev, sem uporabil piši () z uporabo deskriptorja datoteke pipe pipe pipefds [1] kot sledi.
pisanje (pipefds [1], pin, 5);Zdaj, ko imam nekaj podatkov v cevi, jih lahko preberem iz cevi s pomočjo preberi () v deskriptorju datoteke za branje cevi pipefds [0]. Kot sem napisal 5 bajtov podatkov (pin) v cev bom prebral tudi 5 bajtov podatkov iz cevi. Prebrani podatki bodo shranjeni v medpomnilnik niz znakov. Ker bom prebral 5 bajtov podatkov iz cevi, medpomnilnik niz znakov mora biti dolg najmanj 5 bajtov.
Določil sem medpomnilnik niz znakov na začetku glavni () funkcijo.
medpomnilnik char [5];Zdaj lahko preberem PIN iz cevi in ga shranim v medpomnilnik matrika z naslednjo vrstico.
branje (pipefds [0], medpomnilnik, 5);Zdaj, ko sem prebral PIN iz cevi, ga lahko natisnem s pomočjo printf () deluje kot običajno.
printf ("PIN iz cevi:% s \ n", medpomnilnik);Ko zaženem program, se prikaže pravi izhod, kot vidite.
3. primer:
Ustvarite novo izvorno datoteko C 3_pipe.c kot tip v naslednjih vrsticah kod.
#include#include
#include
#include
#include
int main (void)
int pipefds [2];
char * pin;
medpomnilnik char [5];
če (cev (pipefds) == -1)
perror ("cev");
izhod (EXIT_FAILURE);
pid_t pid = fork ();
if (pid == 0) // v podrejenem procesu
pin = "4821 \ 0"; // PIN za pošiljanje
zapri (pipefds [0]); // zaprto branje fd
pisanje (pipefds [1], pin, 5); // vpiši PIN v cev
printf ("Ustvarjanje PIN-a za otroka in pošiljanje staršu… \ n");
spanje (2); // namerna zamuda
izhod (EXIT_SUCCESS);
if (pid> 0) // v glavnem procesu
počakajte (NULL); // počakamo, da se postopek otroka konča
zapri (pipefds [1]); // zapiši fd
branje (pipefds [0], medpomnilnik, 5); // preberemo PIN iz cevi
zapri (pipefds [0]); // zaprto branje fd
printf ("Starš je prejel PIN '% s' \ n", medpomnilnik);
vrni EXIT_SUCCESS;
V tem primeru sem vam pokazal, kako uporabljati cev za medprocesno komunikacijo. PIN iz otroškega procesa sem poslal v nadrejeni postopek s pomočjo cevi. Nato preberite PIN iz cevi v nadrejenem postopku in jo natisnite iz nadrejenega postopka.
Najprej sem ustvaril podrejeni postopek s funkcijo fork ().
pid_t pid = fork ();Nato v otroškem procesu (pid == 0), V cev sem napisal PIN s pomočjo piši () funkcijo.
pisanje (pipefds [1], pin, 5);Ko je PIN zapisan v cev iz podrejenega procesa, nadrejeni postopek (pid> 0) preberite iz cevi s pomočjo preberi () funkcijo.
branje (pipefds [0], medpomnilnik, 5);Nato je nadrejeni postopek s pomočjo natisnil kodo PIN printf () deluje kot običajno.
printf ("Starš je prejel PIN '% s' \ n", medpomnilnik);Kot lahko vidite, zagon programa daje pričakovani rezultat.
Primer 4:
Ustvarite novo izvorno datoteko C 4_pipe.c kot tip v naslednjih vrsticah kod.
#include#include
#include
#include
#include
#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2
void getPIN (char pin [PIN_LENGTH + 1])
srand (getpid () + getppid ());
zatič [0] = 49 + rand ()% 7;
za (int i = 1; i < PIN_LENGTH; i++)
zatič [i] = 48 + rand ()% 7;
pin [PIN_LENGTH] = '\ 0';
int main (void)
medtem ko (1)
int pipefds [2];
črkovni zatič [PIN_LENGTH + 1];
medpomnilnik znakov [PIN_LENGTH + 1];
cev (pipefds);
pid_t pid = fork ();
če (pid == 0)
getPIN (pin); // ustvari PIN
zapri (pipefds [0]); // zaprto branje fd
pisanje (pipefds [1], pin, PIN_LENGTH + 1); // vpiši PIN v cev
printf ("Ustvarjanje PIN-a za otroka in pošiljanje staršu… \ n");
spanje (PIN_WAIT_INTERVAL); // namerno zavlačevanje generacije PIN.
izhod (EXIT_SUCCESS);
če (pid> 0)
počakajte (NULL); // čakanje, da otrok konča
zapri (pipefds [1]); // zapiši fd
branje (pipefds [0], medpomnilnik, PIN_LENGTH + 1); // preberemo PIN iz cevi
zapri (pipefds [0]); // zaprto branje fd
printf ("Starš je od otroka prejel PIN '% s'.\ n \ n ", medpomnilnik);
vrni EXIT_SUCCESS;
Ta primer je enak kot 3. primer. Edina razlika je v tem, da ta program neprestano ustvarja podrejeni proces, v podrejenem procesu generira PIN in s pomočjo cevi pošlje PIN starševskemu procesu.
Nadrejeni postopek nato prebere kodo PIN iz cevi in jo natisne.
Ta program ustvari nov PIN_LENGTH PIN vsakih PIN_WAIT_INTERVAL sekund.
Kot lahko vidite, program deluje po pričakovanjih.
Program lahko ustavite samo s pritiskom na
Torej, tako uporabljate sistemski klic pipe () v programskem jeziku C. Hvala, ker ste prebrali ta članek.