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úraManuá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.