Syntaxe souboru trubka() funkce je:
inttrubka(intpipefd[2]);
Zde funkce pipe () vytvoří jednosměrný datový kanál pro meziprocesovou komunikaci. Předáte int Pole typu (Integer) pipefd skládající se ze 2 prvků pole do funkce pipe (). Poté funkce pipe () vytvoří dva popisovače souborů v souboru pipefd pole.
První prvek souboru pipefd pole, pipefd [0] slouží ke čtení dat z potrubí.
Druhý prvek souboru pipefd pole, pipefd [1] slouží k zápisu dat do kanálu.
V případě úspěchu vrátí funkce pipe () hodnotu 0. Pokud během inicializace kanálu dojde k chybě, funkce pipe () vrátí hodnotu -1.
Funkce pipe () je definována v záhlaví unistd.h . Abyste mohli používat funkci pipe () ve vašem programu C, musíte zahrnout záhlaví unistd.h jak následuje:
#zahrnout
Další informace o funkci systému pipe () najdete na manuálové stránce pipe () pomocí následujícího příkazu:
$ muž2trubkaMan page of pipe().
Příklad 1:
V prvním příkladu vytvořte nový zdrojový soubor C. 1_pipe.c a zadejte následující řádky kódů.
#zahrnout#zahrnout
#zahrnout
inthlavní(prázdné) {
intfajfky[2];
-li(trubka(fajfky) == -1) {
perror ('trubka');
výstup (EXIT_FAILURE);
}
printf ('Přečíst hodnotu deskriptoru souboru: %d n',fajfky[0]);
printf ('Zápis hodnoty popisovače souboru: %d n',fajfky[1]);
vrátit seEXIT_SUCCESS;
}
Zde jsem zahrnoval soubor záhlaví pipe () unistd.h nejprve s následujícím řádkem.
#zahrnoutPoté v hlavní() funkce, definoval jsem fajfky celočíselné pole dvou prvků s následujícím řádkem.
intfajfky[2];Poté jsem spustil funkci pipe () k inicializaci pole deskriptorů souborů fajfky jak následuje.
trubka(fajfky)Také jsem zkontroloval chyby pomocí návratové hodnoty funkce pipe (). Použil jsem výstup() funkce k ukončení programu v případě, že funkce potrubí selže.
-li(trubka(fajfky) == -1) {perror ('trubka');
výstup (EXIT_FAILURE);
}
Poté jsem vytiskl hodnotu deskriptorů souborů pro čtení a zápis do souboru pipefds [0] a pipefds [1] resp.
printf ('Přečíst hodnotu deskriptoru souboru: %d n',fajfky[0]);printf ('Zápis hodnoty popisovače souboru: %d n',fajfky[1]);
Pokud spustíte program, měli byste vidět následující výstup. Jak vidíte, hodnota deskriptoru souboru pro čtení potrubí pipefds [0] je 3 a napište popisovač souboru potrubí pipefds [1] je 4 .
Příklad 2:
Vytvořte další zdrojový soubor C. 2_pipe.c a zadejte následující řádky kódů.
#zahrnout#zahrnout
#zahrnout
#zahrnout
inthlavní(prázdné) {
intfajfky[2];
charvyrovnávací paměť[5];
-li(trubka(fajfky) == -1) {
perror ('trubka');
výstup (EXIT_FAILURE);
}
char *kolík= „4128 0';
printf ('Zápis PIN do potrubí ... n');
napsat(fajfky[1],kolík, 5);
printf ('Hotovo. n n');
printf ('Čtení PIN z potrubí ... n');
číst(fajfky[0],vyrovnávací paměť, 5);
printf ('Hotovo. n n');
printf ('PIN z potrubí: %s n',vyrovnávací paměť);
vrátit seEXIT_SUCCESS;
}
Tento program vám v podstatě ukazuje, jak zapisovat do kanálu a číst data, která jste do něj napsali.
Zde jsem uložil 4místný PIN kód do souboru char pole. Délka pole je 5 (včetně znaku NULL 0).
char *kolík= „4128 0';Každý znak ASCII má velikost 1 bajt v C. Chcete -li tedy odeslat 4místný kód PIN potrubím, musíte do kanálu zapsat 5 bajtů (4 + 1 NULL znak) dat.
Chcete -li zapsat 5 bajtů dat ( kolík ) do potrubí, použil jsem napsat() funkce pomocí deskriptoru souboru pro zápis potrubí pipefds [1] jak následuje.
napsat(fajfky[1],kolík, 5);Nyní, když mám v potrubí nějaká data, mohu je přečíst z kanálu pomocí číst() funkce v deskriptoru souboru pro čtení potrubí pipefds [0] . Jak jsem napsal 5 bajtů dat ( kolík ) do potrubí, budu také číst 5 bytů dat z potrubí. Načtená data budou uložena v vyrovnávací paměť pole znaků. Jak budu číst 5 bajtů dat z kanálu, vyrovnávací paměť pole znaků musí být alespoň 5 bajtů dlouhé.
Definoval jsem vyrovnávací paměť pole znaků na začátku hlavní() funkce.
charvyrovnávací paměť[5];Nyní mohu přečíst PIN z potrubí a uložit jej do vyrovnávací paměť pole s následujícím řádkem.
číst(fajfky[0],vyrovnávací paměť, 5);Nyní, když jsem přečetl PIN z dýmky, mohu jej vytisknout pomocí printf () fungovat jako obvykle.
printf ('PIN z potrubí: %s n',vyrovnávací paměť);Jakmile spustím program, zobrazí se správný výstup, jak vidíte.
Příklad 3:
Vytvořte nový zdrojový soubor C. 3_pipe.c jako typ v následujících řádcích kódů.
#zahrnout#zahrnout
#zahrnout
#zahrnout
#zahrnout
inthlavní(prázdné) {
intfajfky[2];
char *kolík;
charvyrovnávací paměť[5];
-li(trubka(fajfky) == -1) {
perror ('trubka');
výstup (EXIT_FAILURE);
}
pid_t pid=Vidlička();
-li(pid== 0) { // v dětském procesu
kolík= „4821 0'; // PIN k odeslání
zavřít(fajfky[0]); // zavřít číst fd
napsat(fajfky[1],kolík, 5); // napište PIN do potrubí
printf („Generování PINu u dítěte a odesílání rodiči ... n');
spát(2); // záměrné zpoždění
výstup (EXIT_SUCCESS);
}
-li(pid> 0) { // v hlavním procesu
Počkejte(NULA); // počkejte na dokončení podřízeného procesu
zavřít(fajfky[1]); // zavřít napsat fd
číst(fajfky[0],vyrovnávací paměť, 5); // přečtěte PIN z potrubí
zavřít(fajfky[0]); // zavřít číst fd
printf ('Rodič obdržel PIN'%s ' n',vyrovnávací paměť);
}
vrátit seEXIT_SUCCESS;
}
V tomto příkladu jsem vám ukázal, jak používat potrubí pro meziprocesovou komunikaci. Odeslal jsem PIN z podřízeného procesu do nadřazeného procesu pomocí dýmky. Potom přečtěte PIN z kanálu v nadřazeném procesu a vytiskněte jej z nadřazeného procesu.
Nejprve jsem vytvořil podřízený proces pomocí funkce fork ().
pid_t pid=Vidlička();Potom v podřízeném procesu ( pid == 0 ), PIN jsem napsal na trubku pomocí napsat() funkce.
napsat(fajfky[1],kolík, 5);Jakmile je PIN zapsán do kanálu z podřízeného procesu, nadřazený proces ( pid> 0 ) přečtěte si to z potrubí pomocí číst() funkce.
číst(fajfky[0],vyrovnávací paměť, 5);Potom rodičovský proces vytiskl PIN pomocí printf () fungovat jako obvykle.
printf ('Rodič obdržel PIN'%s ' n',vyrovnávací paměť);Jak vidíte, spuštění programu dává očekávaný výsledek.
Příklad 4:
Vytvořte nový zdrojový soubor C. 4_pipe.c jako typ v následujících řádcích kódů.
#zahrnout#zahrnout
#zahrnout
#zahrnout
#zahrnout
#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2
prázdnégetPIN(charkolík[PIN_LENGTH+ 1]) {
srand (dostat se() +getppid());
kolík[0] = 49 + řádek () % 7;
pro(intjá= 1;já<PIN_LENGTH;já++) {
kolík[já] = 48 + řádek () % 7;
}
kolík[PIN_LENGTH] = ' 0';
}
inthlavní(prázdné) {
zatímco(1) {
intfajfky[2];
charkolík[PIN_LENGTH+ 1];
charvyrovnávací paměť[PIN_LENGTH+ 1];
trubka(fajfky);
pid_t pid=Vidlička();
-li(pid== 0) {
getPIN(kolík); // vygenerovat PIN
zavřít(fajfky[0]); // zavřít číst fd
napsat(fajfky[1],kolík,PIN_LENGTH+ 1); // napište PIN do potrubí
printf („Generování PINu u dítěte a odesílání rodiči ... n');
spát(PIN_WAIT_INTERVAL); // záměrné zpoždění generování PINu.
výstup (EXIT_SUCCESS);
}
-li(pid> 0) {
Počkejte(NULA); // čekání na dokončení dítěte
zavřít(fajfky[1]); // zavřít napsat fd
číst(fajfky[0],vyrovnávací paměť,PIN_LENGTH+ 1); // přečtěte PIN z potrubí
zavřít(fajfky[0]); // zavřít číst fd
printf („Rodič obdržel od dítěte PIN„%s “. n n',vyrovnávací paměť);
}
}
vrátit seEXIT_SUCCESS;
}
Tento příklad je stejný jako Příklad 3 . Jediným rozdílem je, že tento program nepřetržitě vytváří podřízený proces, generuje PIN v podřízeném procesu a odesílá PIN nadřazenému procesu pomocí kanálu.
Nadřazený proces pak načte PIN z kanálu a vytiskne ho.
Tento program generuje nový PIN_LENGTH PIN každých PIN_WAIT_INTERVAL sekund.
Jak vidíte, program funguje podle očekávání.
Program můžete zastavit pouze stisknutím + C .
Takto tedy používáte systémové volání pipe () v programovacím jazyce C. Děkujeme za přečtení tohoto článku.