C Programmēšana

Cauruļu sistēmas izsaukums C

Cauruļu sistēmas izsaukums C
caurule () ir Linux sistēmas funkcija. The caurule () sistēmas funkcija tiek izmantota, lai atvērtu failu aprakstus, kurus izmanto saziņai starp dažādiem Linux procesiem. Īsāk sakot caurule () funkcija tiek izmantota starpprocesu saziņai Linux.  Šajā rakstā es parādīšu, kā Linux sistēmā izmantot pipe () sistēmas funkciju. Tātad, sāksim darbu.

Viss par cauruli () Funkcija:

Sintakse caurule () funkcija ir:

int caurule (int pipefd [2]);

Šeit caurule () izveido vienvirziena datu kanālu starpprocesu komunikācijai. Jūs ieejat int (Integer) tipa masīvs pipefd kas sastāv no 2 bloku elementa pie funkcionālās caurules (). Tad funkcija pipe () izveido divus failu aprakstus pipefd masīvs.

Pirmais pipefd masīvs, pipefd [0] tiek izmantots datu nolasīšanai no caurules.

Programmas otrais elements pipefd masīvs, pipefd [1] tiek izmantots datu ierakstīšanai caurulē.

Pēc panākumiem funkcija pipe () atgriež 0. Ja caurules inicializācijas laikā rodas kļūda, funkcija pipe () atgriež -1.

Funkcija pipe () ir definēta galvenē unistd.h. Lai izmantotu funkciju pipe () savā C programmā, jāiekļauj galvene unistd.h sekojoši:

# iekļaut

Lai iegūtu papildinformāciju par pipe () sistēmas funkciju, pārbaudiet pipe () rokasgrāmatu ar šādu komandu:

$ man 2 caurule
Caurules () lapa.

1. piemērs:

Pirmajam piemēram izveidojiet jaunu C avota failu 1_pipe.c un ierakstiet šādas kodu rindas.

# iekļaut
# iekļaut
# iekļaut
 
int main (void)
int pipefds [2];
 
ja (caurule (pipefds) == -1)
perror ("caurule");
izeja (EXIT_FAILURE);

 
printf ("Lasīt faila deskriptora vērtību:% d \ n", pipefds [0]);
printf ("Rakstīt faila deskriptora vērtību:% d \ n", pipefds [1]);
 
atgriešanās EXIT_SUCCESS;

Šeit es iekļāvu caurules () galvenes failu unistd.h vispirms ar šādu rindu.

# iekļaut

Tad galvenais () funkciju, es definēju pipefds divu elementu veselo masīvu ar šādu rindu.

int pipefds [2];

Tad es palaidu funkciju pipe (), lai inicializētu failu deskriptoru masīvu pipefds sekojoši.

caurule (pipefds)

Pārbaudīju arī kļūdas, izmantojot caurules () funkcijas atgriešanās vērtību. Es izmantoju Izeja() funkcija, lai pārtrauktu programmu, ja cauruļu funkcija neizdodas.

ja (caurule (pipefds) == -1)
perror ("caurule");
izeja (EXIT_FAILURE);

Tad es izdrukāju lasāmo un rakstāmo cauruļu failu deskriptoru vērtību pipefds [0] un pipefds [1] attiecīgi.

printf ("Lasīt faila deskriptora vērtību:% d \ n", pipefds [0]);
printf ("Rakstīt faila deskriptora vērtību:% d \ n", pipefds [1]);

Ja palaižat programmu, jums vajadzētu redzēt šādu izvadi. Kā redzat, izlasītās caurules faila deskriptora vērtība pipefds [0] ir 3 un uzrakstiet caurules faila deskriptoru pipefds [1] ir 4.

2. piemērs:

Izveidojiet citu C avota failu 2_pipe.c un ierakstiet šādas kodu rindas.

# iekļaut
# iekļaut
# iekļaut
# iekļaut
 
int main (void)
int pipefds [2];
char buferis [5];
 
ja (caurule (pipefds) == -1)
perror ("caurule");
izeja (EXIT_FAILURE);

 
char * pin = "4128 \ 0";
 
printf ("PIN rakstīšana caurulē ... \ n");
rakstīt (pipefds [1], pin, 5);
printf ("Gatavs.\ n \ n ");
 
printf ("PIN lasīšana no caurules ... \ n");
lasīt (pipefds [0], buferis, 5);
printf ("Gatavs.\ n \ n ");
 
printf ("PIN no caurules:% s \ n", buferis);
 
atgriešanās EXIT_SUCCESS;

Šī programma būtībā parāda, kā rakstīt caurulē un nolasīt no caurules rakstītos datus.

Šeit es saglabāju 4 rakstzīmju PIN kodu char masīvs. Masīva garums ir 5 (ieskaitot NULL rakstzīmi \ 0).

char * pin = "4128 \ 0";

Katra ASCII rakstzīme ir 1 baits C lielumā. Tātad, lai caur cauruli nosūtītu 4 ciparu PIN kodu, caurulē jāieraksta 5 baiti (4 + 1 NULL rakstzīme) datu.

Lai uzrakstītu 5 baitus datu (piespraust) caurulē, es izmantoju rakstīt () funkcija, izmantojot rakstīšanas caurules faila deskriptoru pipefds [1] sekojoši.

rakstīt (pipefds [1], pin, 5);

Tagad, kad man ir daži dati caurulē, es tos varu izlasīt no caurules, izmantojot lasīt () funkcija lasītās caurules faila aprakstā pipefds [0]. Kā esmu uzrakstījis 5 baitus datu (piespraust) caurulē, es nolasīšu arī 5 baitus datu no caurules. Izlasītie dati tiks saglabāti buferis rakstzīmju masīvs. Kad es lasīšu 5 baitus datu no caurules, buferis rakstzīmju masīvam jābūt vismaz 5 baitu garam.

Es esmu definējis buferis rakstzīmju masīvs galvenais () funkciju.

char buferis [5];

Tagad es varu izlasīt PIN no caurules un uzglabāt to buferis masīvs ar šādu rindu.

lasīt (pipefds [0], buferis, 5);

Tagad, kad esmu izlasījis PIN no caurules, es varu to izdrukāt, izmantojot printf () darbojas kā parasti.

printf ("PIN no caurules:% s \ n", buferis);

Kad es palaidu programmu, tiek parādīta pareizā izeja, kā redzat.

3. piemērs:

Izveidojiet jaunu C avota failu 3_pipe.c kā veidu šādās kodu rindās.

# iekļaut
# iekļaut
# iekļaut
# iekļaut
# iekļaut
int main (void)
int pipefds [2];
char * tapa;
char buferis [5];
 
ja (caurule (pipefds) == -1)
perror ("caurule");
izeja (EXIT_FAILURE);

 
pid_t pid = dakša ();
 
if (pid == 0) // bērna procesā
tapa = "4821 \ 0"; // PIN nosūtīt
aizvērt (pipefds [0]); // aizvērt lasīt fd
rakstīt (pipefds [1], pin, 5); // ierakstiet PIN caurulē
 
printf ("PIN ģenerēšana bērnam un nosūtīšana vecākiem ... \ n");
gulēt (2); // tīša kavēšanās
izeja (EXIT_SUCCESS);

 
if (pid> 0) // galvenajā procesā
pagaidiet (NULL); // gaidiet, kamēr bērna process beigsies
aizvērt (pipefds [1]); // aizvērt rakstīt fd
lasīt (pipefds [0], buferis, 5); // lasīt PIN no caurules
aizvērt (pipefds [0]); // aizvērt lasīt fd
 
printf ("Vecāks saņēma PIN '% s' \ n", buferis);

 
atgriešanās EXIT_SUCCESS;

Šajā piemērā es parādīju, kā izmantot cauruli starpprocesu saziņai. Esmu nosūtījis PIN no bērna procesa uz vecāku procesu, izmantojot pīpi. Pēc tam izlasiet vecāku procesa caurules PIN un izdrukājiet to no vecāku procesa.

Pirmkārt, esmu izveidojis bērnu procesu, izmantojot funkciju fork ().

pid_t pid = dakša ();

Tad bērna procesā (pid == 0), Es uzrakstīju PIN caurulei, izmantojot rakstīt () funkciju.

rakstīt (pipefds [1], pin, 5);

Kad PIN ir ierakstīts caurulē no bērna procesa, vecāku process (pid> 0) izlasiet to no caurules, izmantojot lasīt () funkciju.

lasīt (pipefds [0], buferis, 5);

Pēc tam vecāku process PIN kodu izdrukāja, izmantojot printf () darbojas kā parasti.

printf ("Vecāks saņēma PIN '% s' \ n", buferis);

Kā redzat, programmas palaišana dod gaidīto rezultātu.

4. piemērs:

Izveidojiet jaunu C avota failu 4_pipe.c kā veidu šādās kodu rindās.

# iekļaut
# iekļaut
# iekļaut
# iekļaut
# iekļaut
 
#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2
 
void getPIN (char pin [PIN_LENGTH + 1])
srand (getpid () + getppid ());
 
tapa [0] = 49 + rand ()% 7;
 
par (int i = 1; i < PIN_LENGTH; i++)
piespraude [i] = 48 + rand ()% 7;

 
piespraude [PIN_LENGTH] = '\ 0';

 
 
int main (void)
kamēr (1)
int pipefds [2];
char pin [PIN_LENGTH + 1];
char buferis [PIN_LENGTH + 1];
 
caurule (pipefds);
 
pid_t pid = dakša ();
 
ja (pid == 0)
getPIN (tapa); // ģenerēt PIN
aizvērt (pipefds [0]); // aizvērt lasīt fd
rakstīt (pipefds [1], pin, PIN_LENGTH + 1); // ierakstiet PIN caurulē
 
printf ("PIN ģenerēšana bērnam un nosūtīšana vecākiem ... \ n");
 
gulēt (PIN_WAIT_INTERVAL); // apzināti aizkavē PIN ģenerēšanu.
 
izeja (EXIT_SUCCESS);

 
ja (pid> 0)
pagaidiet (NULL); // gaida, kad bērns beigs
 
aizvērt (pipefds [1]); // aizvērt rakstīt fd
lasīt (pipefds [0], buferis, PIN_LENGTH + 1); // lasīt PIN no caurules
aizvērt (pipefds [0]); // aizvērt lasīt fd
printf ("Vecāki saņēma PIN kodu% s" no bērna.\ n \ n ", buferis);


 
atgriešanās EXIT_SUCCESS;

Šis piemērs ir tāds pats kā 3. piemērs. Vienīgā atšķirība ir tā, ka šī programma nepārtraukti rada bērna procesu, ģenerē PIN bērnu procesā un nosūta PIN vecāku procesam, izmantojot cauruli.

Pēc tam vecāku process no caurules nolasa PIN un izdrukā to.

Šī programma ģenerē jaunu PIN_LENGTH PIN ik pēc PIN_WAIT_INTERVAL sekundēm.

Kā redzat, programma darbojas kā paredzēts.

Programmu var apturēt, tikai nospiežot + C.

Tātad, šādi jūs izmantojat pipe () sistēmas izsaukumu C programmēšanas valodā. Paldies, ka izlasījāt šo rakstu.

Instalējiet jaunāko OpenRA stratēģijas spēli Ubuntu Linux
OpenRA ir bezmaksas / bezmaksas reāllaika stratēģijas spēļu dzinējs, kas atjauno agrīnās Vestvudas spēles, piemēram, klasisko Command & Conquer: Red A...
Instalējiet jaunāko Dolphin emulatoru Gamecube un Wii operētājsistēmai Linux
Delfīnu emulators ļauj jums spēlēt izvēlētās Gamecube un Wii spēles Linux personālajos datoros (PC). Tā kā Dolphin Emulator ir brīvi pieejams un atvē...
Kā lietot GameConqueror Cheat Engine Linux
Rakstā ir sniegts ceļvedis par GameConqueror apkrāptu dzinēja izmantošanu Linux. Daudzi lietotāji, kas spēlē spēles operētājsistēmā Windows, bieži izm...