Systémové volání potrubí v C

Pipe System Call C



trubka() je funkce systému Linux. The trubka() systémová funkce slouží k otevření deskriptorů souborů, které slouží ke komunikaci mezi různými procesy Linuxu. Stručně řečeno, trubka() funkce se používá pro meziprocesovou komunikaci v Linuxu. V tomto článku vám ukážu, jak používat systémovou funkci pipe () v Linuxu. Začněme tedy.

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ž2trubka
Man 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.

#zahrnout

Poté 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(int= 1;<PIN_LENGTH;++) {
kolík[] = 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.