Cauruļu sistēmas zvans C

Pipe System Call C



caurule () ir Linux sistēmas funkcija. The caurule () sistēmas funkcija tiek izmantota, lai atvērtu failu aprakstus, kurus izmanto, lai sazinātos starp dažādiem Linux procesiem. Īsāk sakot, caurule () Šī funkcija tiek izmantota savstarpējai komunikācijai Linux. Šajā rakstā es jums parādīšu, kā izmantot sistēmas pipe () sistēmu Linux. Tātad, sāksim.

Sintakse caurule () funkcija ir:







intcaurule(intpipefd[2]);

Šeit funkcija pipe () izveido vienvirziena datu kanālu savstarpējai komunikācijai. Jūs ejat garām int (Vesels skaitlis) tipa masīvs pipefd kas sastāv no 2 masīva elementa līdz funkcionālajai caurulei (). Pēc tam funkcija pipe () izveido divus failu aprakstus pipefd masīvs.



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



Otrais elements pipefd masīvs, pipefd [1] izmanto datu ierakstīšanai caurulē.





Veiksmīgi, funkcija pipe () atgriež 0. Ja caurules inicializācijas laikā rodas kļūda, tad funkcija pipe () atgriež -1.

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



#iekļaut

Lai iegūtu papildinformāciju par cauruļu () sistēmas funkciju, pārbaudiet caurules () rokasgrāmatu, izmantojot šādu komandu:

$ cilvēks2caurule
Caurules cilvēka lapa().

1. piemērs:

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

#iekļaut
#iekļaut
#iekļaut

intgalvenais(spēkā neesošs) {
intpipefds[2];

ja(caurule(pipefds) == -1) {
kļūda ('caurule');
Izeja (EXIT_FAILURE);
}

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

atgrieztiesEXIT_SUCCESS;
}

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

#iekļaut

Pēc tam, galvenais () funkciju, es definēju pipefds divu elementu veselu skaitļu masīvs ar šādu rindu.

intpipefds[2];

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

caurule(pipefds)

Es arī pārbaudīju, vai nav kļūdu, izmantojot funkcijas pipe () atgriešanas vērtību. Es izmantoju Izeja() funkcija, lai pārtrauktu programmu gadījumā, ja caurules funkcija neizdodas.

ja(caurule(pipefds) == -1) {
kļūda ('caurule');
Izeja (EXIT_FAILURE);
}

Pēc tam es izdrukāju lasīšanas un rakstīšanas cauruļu failu deskriptoru vērtību pipefds [0] un pipefds [1] attiecīgi.

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

Palaižot programmu, jums vajadzētu redzēt šādu izvadi. Kā redzat, nolasīto cauruļu failu 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

intgalvenais(spēkā neesošs) {
intpipefds[2];
charbuferšķīdums[5];

ja(caurule(pipefds) == -1) {
kļūda ('caurule');
Izeja (EXIT_FAILURE);
}

char *pin= “4128 0';

printf ('Notiek PIN ierakstīšana caurulē ... n');
rakstīt(pipefds[1],pin, 5);
printf ('Gatavs. n n');

printf ('PIN nolasīšana no caurules ... n');
lasīt(pipefds[0],buferšķīdums, 5);
printf ('Gatavs. n n');

printf ('PIN no caurules: %s n',buferšķīdums);

atgrieztiesEXIT_SUCCESS;
}

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

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

char *pin= “4128 0';

Katras ASCII rakstzīmes lielums ir 1 baits C. Tātad, lai nosūtītu četrciparu PIN caur cauruli, caurulē jāievada 5 baiti (4 + 1 NULL rakstzīme) datu.

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

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

Tagad, kad caurulē ir daži dati, es varu tos nolasīt no caurules, izmantojot lasīt () funkcija nolasīšanas caurules faila deskriptorā pipefds [0] . Kā esmu uzrakstījis 5 baitus datu ( pin ) caurulē, es nolasīšu arī 5 baitus datus no caurules. Nolasītie dati tiks saglabāti buferšķīdums rakstzīmju masīvs. Tā kā es lasīšu 5 baitus datu no caurules, buferšķīdums rakstzīmju masīvam jābūt vismaz 5 baitiem garam.

Esmu definējis buferšķīdums rakstzīmju masīvs galvenais () funkciju.

charbuferšķīdums[5];

Tagad es varu nolasīt PIN no caurules un uzglabāt to buferšķīdums masīvs ar šādu rindu.

lasīt(pipefds[0],buferšķīdums, 5);

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

printf ('PIN no caurules: %s n',buferšķīdums);

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

3. piemērs:

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

#iekļaut
#iekļaut
#iekļaut
#iekļaut
#iekļaut
intgalvenais(spēkā neesošs) {
intpipefds[2];
char *pin;
charbuferšķīdums[5];

ja(caurule(pipefds) == -1) {
kļūda ('caurule');
Izeja (EXIT_FAILURE);
}

pid_t pid=dakša();

ja(pid== 0) { // bērna procesā
pin= “4821 0'; // PIN nosūtīšanai
aizvērt(pipefds[0]); // aizvērt lasīt fd
rakstīt(pipefds[1],pin, 5); // rakstīt PIN caurulē

printf (“Tiek ģenerēts PIN kods bērnam un nosūtīts vecākiem ... n');
Gulēt(2); // tīša kavēšanās
Izeja (EXIT_SUCCESS);
}

ja(pid> 0) { // galvenajā procesā
pagaidi(NULL); // gaidiet, kamēr bērna process tiks pabeigts
aizvērt(pipefds[1]); // aizvērt rakstīt fd
lasīt(pipefds[0],buferšķīdums, 5); // nolasīt PIN no caurules
aizvērt(pipefds[0]); // aizvērt lasīt fd

printf ('Vecāks saņēma PIN'%s ' n',buferšķīdums);
}

atgrieztiesEXIT_SUCCESS;
}

Šajā piemērā es parādīju, kā izmantot cauruli savstarpējai komunikācijai. Es nosūtīju PIN kodu no bērna procesa uz vecāku procesu, izmantojot cauruli. Pēc tam nolasiet PIN kodu no caurules vecāku procesā un izdrukājiet to no vecāku procesa.

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

pid_t pid=dakša();

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

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

Kad PIN kods ir ierakstīts caurulē no pakārtotā procesa, vecāku process ( pid> 0 ) nolasiet to no caurules, izmantojot lasīt () funkciju.

lasīt(pipefds[0],buferšķīdums, 5);

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

printf ('Vecāks saņēma PIN'%s ' n',buferšķīdums);

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

4. piemērs:

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

#iekļaut
#iekļaut
#iekļaut
#iekļaut
#iekļaut

#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2

spēkā neesošsgetPIN(charpin[PIN_LENGTH+ 1]) {
srand (stulbs() +getppid());

pin[0] = 49 + rinda () % 7;

priekš(inti= 1;i<PIN_LENGTH;i++) {
pin[i] = 48 + rinda () % 7;
}

pin[PIN_LENGTH] = ' 0';
}


intgalvenais(spēkā neesošs) {
kamēr(1) {
intpipefds[2];
charpin[PIN_LENGTH+ 1];
charbuferšķīdums[PIN_LENGTH+ 1];

caurule(pipefds);

pid_t pid=dakša();

ja(pid== 0) {
getPIN(pin); // ģenerēt PIN
aizvērt(pipefds[0]); // aizvērt lasīt fd
rakstīt(pipefds[1],pin,PIN_LENGTH+ 1); // rakstīt PIN caurulē

printf (“Tiek ģenerēts PIN kods bērnam un nosūtīts vecākiem ... n');

Gulēt(PIN_WAIT_INTERVAL); // apzināti aizkavē PIN ģenerēšanu.

Izeja (EXIT_SUCCESS);
}

ja(pid> 0) {
pagaidi(NULL); // gaida, kad bērns beigs

aizvērt(pipefds[1]); // aizvērt rakstīt fd
lasīt(pipefds[0],buferšķīdums,PIN_LENGTH+ 1); // nolasīt PIN no caurules
aizvērt(pipefds[0]); // aizvērt lasīt fd
printf ('Vecāks no bērna saņēma PIN'%s '. n n',buferšķīdums);
}
}

atgrieztiesEXIT_SUCCESS;
}

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

Pēc tam vecāku process nolasa no caurules 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, šādā veidā jūs izmantojat pipe () sistēmas izsaukumu C programmēšanas valodā. Paldies, ka izlasījāt šo rakstu.