Systémový hovor potrubia v C

Pipe System Call C



rúra() je funkcia systému Linux. The rúra() systémová funkcia sa používa na otvorenie deskriptorov súborov, ktoré sa používajú na komunikáciu medzi rôznymi procesmi Linuxu. Stručne povedané, rúra() Táto funkcia sa používa na medziprocesovú komunikáciu v systéme Linux. V tomto článku vám ukážem, ako používať funkciu systému pipe () v systéme Linux. Začnime teda.

Syntax súboru rúra() funkcia je:







intrúra(intpipefd[2]);

Tu funkcia pipe () vytvára jednosmerný dátový kanál pre medziprocesovú komunikáciu. Podáte v int Pole (celé číslo) pipefd pozostávajúci z 2 prvkov poľa do funkčného potrubia (). Potom funkcia pipe () vytvorí dva deskriptory súborov v súbore pipefd pole.



Prvým prvkom súboru pipefd pole, pipefd [0] sa používa na čítanie údajov z potrubia.



Druhý prvok súboru pipefd pole, pipefd [1] sa používa na zápis údajov do potrubia.





Pri úspechu funkcia pipe () vráti hodnotu 0. Ak sa počas inicializácie potrubia vyskytne chyba, funkcia pipe () vráti hodnotu -1.

Funkcia pipe () je definovaná v hlavičke unistd.h . Aby ste vo svojom programe C mohli používať funkciu pipe (), musíte zahrnúť hlavičku unistd.h nasledovne:



#zahrnúť

Ak chcete získať ďalšie informácie o funkcii systému pipe (), pozrite sa na manuálovú stránku potrubia () pomocou nasledujúceho príkazu:

$ muž2rúra
Manuálna stránka potrubia().

Príklad 1:

V prvom prípade vytvorte nový zdrojový súbor C. 1_pipe.c a zadajte nasledujúce riadky kódov.

#zahrnúť
#zahrnúť
#zahrnúť

intHlavná(prázdny) {
intpipefds[2];

keby(rúra(pipefds) == -1) {
hrôza ('rúra');
východ (EXIT_FAILURE);
}

printf ('Prečítajte si hodnotu deskriptora súboru: %d n',pipefds[0]);
printf ('Hodnota deskriptora súboru zápisu: %d n',pipefds[1]);

vrátiť saEXIT_SUCCESS;
}

Tu som zahrnul hlavičkový súbor pipe () unistd.h najskôr s nasledujúcim riadkom.

#zahrnúť

Potom v Hlavná() funkciu, definoval som pipefds dvojprvkové celočíselné pole s nasledujúcim riadkom.

intpipefds[2];

Potom som spustil funkciu pipe () na inicializáciu poľa deskriptorov súborov pipefds nasledovne.

rúra(pipefds)

Tiež som skontroloval chyby pomocou návratovej hodnoty funkcie pipe (). Použil som východ() funkciu na ukončenie programu v prípade, že funkcia potrubia zlyhá.

keby(rúra(pipefds) == -1) {
hrôza ('rúra');
východ (EXIT_FAILURE);
}

Potom som vytlačil hodnotu deskriptorov súborov na čítanie a zápis do súboru fajky [0] a fajky [1] resp.

printf ('Prečítajte si hodnotu deskriptora súboru: %d n',pipefds[0]);
printf ('Hodnota deskriptora súboru zápisu: %d n',pipefds[1]);

Ak spustíte program, mali by ste vidieť nasledujúci výstup. Ako vidíte, hodnota deskriptora súboru na čítanie kanála fajky [0] je 3 a napíšte deskriptor súboru potrubia fajky [1] je 4 .

Príklad 2:

Vytvorte ďalší zdrojový súbor C. 2_pipe.c a zadajte nasledujúce riadky kódov.

#zahrnúť
#zahrnúť
#zahrnúť
#zahrnúť

intHlavná(prázdny) {
intpipefds[2];
charnárazník[5];

keby(rúra(pipefds) == -1) {
hrôza ('rúra');
východ (EXIT_FAILURE);
}

char *špendlík= „4128 0';

printf („Zápis PIN do potrubia ... n');
písať(pipefds[1],špendlík, 5);
printf ('Hotový. n n');

printf („Čítanie kódu PIN z potrubia ... n');
čítať(pipefds[0],nárazník, 5);
printf ('Hotový. n n');

printf ('PIN z potrubia: %s n',nárazník);

vrátiť saEXIT_SUCCESS;
}

Tento program vám v zásade ukazuje, ako písať do kanála a čítať údaje, ktoré ste z kanála zapísali.

Tu som uložil 4-miestny PIN kód do a char pole. Dĺžka poľa je 5 (vrátane znaku NULL 0).

char *špendlík= „4128 0';

Každý znak ASCII má veľkosť 1 bajt v C. Na odoslanie 4 -miestneho PIN kódu potrubím musíte do kanála zapísať 5 bajtov (znak 4 + 1 NULL).

Zapísať 5 bajtov údajov ( špendlík ) do potrubia, použil som napísať () funkciu pomocou deskriptora súboru na zápis do potrubia fajky [1] nasledovne.

písať(pipefds[1],špendlík, 5);

Teraz, keď mám v kanáli nejaké údaje, môžem ich z kanála prečítať pomocou súboru čítať() funkcia v deskriptore súboru na čítanie kanála fajky [0] . Ako som napísal 5 bajtov údajov ( špendlík ) do potrubia, prečítam tiež 5 bajtov údajov z potrubia. Načítané údaje budú uložené v priečinku nárazník pole znakov. Keď budem čítať 5 bajtov údajov z kanála, súbor nárazník pole znakov musí mať najmenej 5 bajtov.

Definoval som nárazník pole znakov na začiatku súboru Hlavná() funkciu.

charnárazník[5];

Teraz môžem prečítať PIN z potrubia a uložiť ho do nárazník pole s nasledujúcim riadkom.

čítať(pipefds[0],nárazník, 5);

Teraz, keď som prečítal PIN z potrubia, môžem ho vytlačiť pomocou printf () fungovať ako obvykle.

printf ('PIN z potrubia: %s n',nárazník);

Po spustení programu sa zobrazí správny výstup, ako vidíte.

Príklad 3:

Vytvorte nový zdrojový súbor C. 3_pipe.c ako typ v nasledujúcich riadkoch kódov.

#zahrnúť
#zahrnúť
#zahrnúť
#zahrnúť
#zahrnúť
intHlavná(prázdny) {
intpipefds[2];
char *špendlík;
charnárazník[5];

keby(rúra(pipefds) == -1) {
hrôza ('rúra');
východ (EXIT_FAILURE);
}

pid_t pid=vidlička();

keby(pid== 0) { // v detskom procese
špendlík= „4821 0'; // PIN na odoslanie
Zavrieť(pipefds[0]); // zavrieť čítať fd
písať(pipefds[1],špendlík, 5); // napíšte PIN do potrubia

printf („Generovanie kódu PIN pre dieťa a odosielanie rodičovi ... n');
spať(2); // úmyselné zdržanie
východ (EXIT_SUCCESS);
}

keby(pid> 0) { // v hlavnom procese
počkaj(NULOVÝ); // počkajte, kým sa dokončí podradený proces
Zavrieť(pipefds[1]); // zavri napis fd
čítať(pipefds[0],nárazník, 5); // prečítajte PIN z potrubia
Zavrieť(pipefds[0]); // zavrieť čítať fd

printf ('Rodič dostal PIN'%s ' n',nárazník);
}

vrátiť saEXIT_SUCCESS;
}

V tomto prípade som vám ukázal, ako používať potrubie na medziprocesovú komunikáciu. Poslal som PIN z podradeného procesu do nadradeného procesu pomocou potrubia. Potom si prečítajte PIN z potrubia v rodičovskom procese a vytlačte ho z rodičovského procesu.

Najprv som vytvoril podradený proces pomocou funkcie fork ().

pid_t pid=vidlička();

Potom v procese dieťaťa ( pid == 0 ), PIN som napísal na potrubie pomocou napísať () funkciu.

písať(pipefds[1],špendlík, 5);

Akonáhle je PIN zapísaný do kanála z podradeného procesu, nadradený proces ( pid> 0 ) prečítajte to z potrubia pomocou čítať() funkciu.

čítať(pipefds[0],nárazník, 5);

Potom rodičovský proces vytlačil kód PIN pomocou printf () fungovať ako obvykle.

printf ('Rodič dostal PIN'%s ' n',nárazník);

Ako vidíte, spustenie programu poskytne očakávaný výsledok.

Príklad 4:

Vytvorte nový zdrojový súbor C. 4_pipe.c ako typ v nasledujúcich riadkoch kódov.

#zahrnúť
#zahrnúť
#zahrnúť
#zahrnúť
#zahrnúť

#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2

prázdnygetPIN(charšpendlík[PIN_LENGTH+ 1]) {
srand (dostať sa() +getppid());

špendlík[0] = 49 + riadok () % 7;

pre(inti= 1;i<PIN_LENGTH;i++) {
špendlík[i] = 48 + riadok () % 7;
}

špendlík[PIN_LENGTH] = ' 0';
}


intHlavná(prázdny) {
kým(1) {
intpipefds[2];
charšpendlík[PIN_LENGTH+ 1];
charnárazník[PIN_LENGTH+ 1];

rúra(pipefds);

pid_t pid=vidlička();

keby(pid== 0) {
getPIN(špendlík); // vygenerovanie PINu
Zavrieť(pipefds[0]); // zavrieť čítať fd
písať(pipefds[1],špendlík,PIN_LENGTH+ 1); // napíšte PIN do potrubia

printf („Generovanie kódu PIN pre dieťa a odosielanie rodičovi ... n');

spať(PIN_WAIT_INTERVAL); // úmyselné oneskorenie generovania PINu.

východ (EXIT_SUCCESS);
}

keby(pid> 0) {
počkaj(NULOVÝ); // čakanie na dokončenie dieťaťa

Zavrieť(pipefds[1]); // zavri napis fd
čítať(pipefds[0],nárazník,PIN_LENGTH+ 1); // prečítajte PIN z potrubia
Zavrieť(pipefds[0]); // zavrieť čítať fd
printf („Rodič dostal od dieťaťa PIN„%s “. n n',nárazník);
}
}

vrátiť saEXIT_SUCCESS;
}

Tento príklad je rovnaký ako Príklad 3 . Jediným rozdielom je, že tento program nepretržite vytvára podradený proces, generuje PIN v podradenom procese a pomocou potrubia odosiela PIN do nadradeného procesu.

Nadradený proces potom načíta PIN z potrubia a vytlačí ho.

Tento program generuje nový PIN_LENGTH PIN každých PIN_WAIT_INTERVAL sekúnd.

Ako vidíte, program funguje podľa očakávania.

Program môžete zastaviť iba stlačením + C. .

Takto teda použijete systémové volanie pipe () v programovacom jazyku C. Ďakujem za prečítanie tohto článku.