C Programiranje

Cevni sistemski klic v C

Cevni sistemski klic v C
cev () je sistemska funkcija Linuxa. The cev () sistemska funkcija se uporablja za odpiranje deskriptorjev datotek, ki se uporabljajo za komunikacijo med različnimi procesi Linuxa. Skratka, cev () funkcija se uporablja za medprocesno komunikacijo v Linuxu.  V tem članku vam bom pokazal, kako uporabljati sistemsko funkcijo pipe () v Linuxu. Torej, začnimo.

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 cev
Priroč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.

#include

Nato 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 + C.

Torej, tako uporabljate sistemski klic pipe () v programskem jeziku C. Hvala, ker ste prebrali ta članek.

Najboljše igre z ročnim sledenjem
Oculus Quest je pred kratkim predstavil odlično idejo ročnega sledenja brez krmilnikov. Z vedno večjim številom iger in dejavnosti, ki izvajajo podpor...
Kako prikazati prekrivanje zaslonskega menija v celozaslonskih aplikacijah in igrah za Linux
Igranje celozaslonskih iger ali uporaba aplikacij v celozaslonskem načinu brez motenj vam lahko odreže ustrezne sistemske informacije, ki so vidne na ...
Top 5 kartic za zajemanje iger
Vsi smo v YouTubu videli in oboževali pretakanje iger. PewDiePie, Jakesepticye in Markiplier so le nekateri izmed najboljših igralcev, ki so zaslužili...