Funkce Vše o potrubí ():
Syntaxe souboru trubka() funkce je:
int potrubí (int pipefd [2]);Zde funkce pipe () vytváří jednosměrný datový kanál pro komunikaci mezi procesy. Vložíte do int Pole typu (Integer) pipefd skládající se ze 2 prvků pole do funkce pipe (). Poté funkce pipe () vytvoří dva deskriptory souborů v souboru pipefd pole.
První prvek pipefd pole, pipefd [0] se používá ke čtení dat z kanálu.
Druhý prvek pipefd pole, pipefd [1] se používá pro zápis dat do kanálu.
Při úspěchu funkce pipe () vrací 0. Pokud během inicializace kanálu dojde k chybě, vrátí funkce pipe () hodnotu -1.
Funkce pipe () je definována v záhlaví unistd.h. Chcete-li použít funkci pipe () ve vašem programu C, musíte zahrnout záhlaví unistd.h jak následuje:
#zahrnoutDalší informace o funkci systému pipe () najdete na stránce manuálu pipe () pomocí následujícího příkazu:
$ muž 2 potrubíManuální stránka 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
int main (void)
int pipefds [2];
if (pipe (pipefds) == -1)
perror ("roura");
exit (EXIT_FAILURE);
printf ("Číst hodnotu deskriptoru souboru:% d \ n", pipefds [0]);
printf ("Hodnota deskriptoru zápisu souboru:% d \ n", pipefds [1]);
vrátit EXIT_SUCCESS;
Zde jsem zahrnoval hlavičkový soubor pipe () unistd.h nejprve s následujícím řádkem.
#zahrnoutPak v hlavní() funkce, definoval jsem pipefds dvouprvkové celé číslo s následujícím řádkem.
int pipefds [2];Poté jsem spustil funkci pipe () k inicializaci pole deskriptorů souborů pipefds jak následuje.
dýmka (pipefds)Také jsem zkontroloval chyby pomocí návratové hodnoty funkce pipe (). Použil jsem výstup() funkce k terminálu programu v případě, že funkce potrubí selže.
if (pipe (pipefds) == -1)perror ("roura");
exit (EXIT_FAILURE);
Poté jsem vytiskl hodnotu deskriptorů souboru pro čtení a zápis potrubí pipefds [0] a pipefds [1] resp.
printf ("Číst hodnotu deskriptoru souboru:% d \ n", pipefds [0]);printf ("Hodnota deskriptoru zápisu souboru:% d \ n", pipefds [1]);
Pokud spustíte program, měl by se zobrazit následující výstup. Jak vidíte, hodnota deskriptoru souboru přečteného kanálu pipefds [0] je 3 a napište deskriptor souboru kanálu 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
int main (void)
int pipefds [2];
char buffer [5];
if (pipe (pipefds) == -1)
perror ("roura");
exit (EXIT_FAILURE);
char * pin = "4128 \ 0";
printf ("Zápis PIN do kanálu ... \ n");
write (pipefds [1], pin, 5);
printf ("Hotovo.\ n \ n ");
printf ("Čtení PIN z kanálu ... \ n");
read (pipefds [0], buffer, 5);
printf ("Hotovo.\ n \ n ");
printf ("PIN z kanálu:% s \ n", vyrovnávací paměť);
vrátit EXIT_SUCCESS;
Tento program v podstatě ukazuje, jak zapisovat do kanálu a číst data, která jste z kanálu napsali.
Zde jsem uložil čtyřmístný PIN kód do a char pole. Délka pole je 5 (včetně znaku NULL \ 0).
char * pin = "4128 \ 0";Každý znak ASCII má velikost 1 bajt v jazyce C. Chcete-li tedy přes kanál poslat čtyřmístný PIN, musíte do kanálu napsat 5 bytů (4 + 1 znak NULL) dat.
Chcete-li zapsat 5 bajtů dat (kolík) do potrubí, použil jsem napsat() funkce pomocí deskriptoru souboru zápisu pipefds [1] jak následuje.
write (pipefds [1], pin, 5);Nyní, když mám v potrubí nějaké údaje, mohu je přečíst z kanálu pomocí číst() funkce v deskriptoru souboru pro čtení kanálu pipefds [0]. Jak jsem napsal 5 bajtů dat (kolík) do kanálu, budu také číst 5 bajtů dat z kanálu. Načtená data budou uložena v nárazník pole znaků. Protože budu číst 5 bajtů dat z kanálu, nárazník pole znaků musí být alespoň 5 bajtů dlouhé.
Definoval jsem nárazník pole znaků na začátku souboru hlavní() funkce.
char buffer [5];Nyní mohu přečíst PIN z kanálu a uložit jej do nárazník pole s následujícím řádkem.
read (pipefds [0], buffer, 5);Nyní, když jsem si přečetl PIN z kanálu, mohu jej vytisknout pomocí printf () fungovat jako obvykle.
printf ("PIN z kanálu:% 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 zadejte v následujících řádcích kódů.
#zahrnout#zahrnout
#zahrnout
#zahrnout
#zahrnout
int main (void)
int pipefds [2];
char * kolík;
char buffer [5];
if (pipe (pipefds) == -1)
perror ("roura");
exit (EXIT_FAILURE);
pid_t pid = vidlice ();
if (pid == 0) // v podřízeném procesu
pin = "4821 \ 0"; // PIN k odeslání
zavřít (pipefds [0]); // zavřít čtení fd
write (pipefds [1], pin, 5); // zapište PIN do kanálu
printf ("Generování PIN u dítěte a odeslání rodiči ... \ n");
spánek (2); // úmyslné zpoždění
exit (EXIT_SUCCESS);
if (pid> 0) // v hlavním procesu
počkat (NULL); // čekat na dokončení podřízeného procesu
zavřít (pipefds [1]); // zavřít zápis fd
read (pipefds [0], buffer, 5); // načíst PIN z kanálu
zavřít (pipefds [0]); // zavřít čtení fd
printf ("Rodič přijal PIN '% s' \ n", vyrovnávací paměť);
vrátit EXIT_SUCCESS;
V tomto příkladu jsem vám ukázal, jak používat potrubí pro komunikaci mezi procesy. Poslal jsem PIN z podřízeného procesu do nadřazeného procesu pomocí kanálu. Poté si 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 = vidlice ();Poté v procesu dítěte (pid == 0), Napsal jsem PIN do kanálu pomocí napsat() funkce.
write (pipefds [1], pin, 5);Jakmile je PIN zapsán do kanálu z podřízeného procesu, nadřazený proces (pid> 0) přečtěte jej z kanálu pomocí číst() funkce.
read (pipefds [0], buffer, 5);Poté nadřazený proces vytiskl PIN pomocí printf () fungovat jako obvykle.
printf ("Rodič přijal PIN '% s' \ n", vyrovnávací paměť);Jak vidíte, spuštění programu poskytuje očekávaný výsledek.
Příklad 4:
Vytvořte nový zdrojový soubor C 4_pipe.C jako zadejte v následujících řádcích kódů.
#zahrnout#zahrnout
#zahrnout
#zahrnout
#zahrnout
#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2
void getPIN (char pin [PIN_LENGTH + 1])
srand (getpid () + getppid ());
pin [0] = 49 + rand ()% 7;
pro (int i = 1; i < PIN_LENGTH; i++)
pin [i] = 48 + rand ()% 7;
pin [PIN_LENGTH] = '\ 0';
int main (void)
while (1)
int pipefds [2];
char pin [PIN_LENGTH + 1];
char buffer [PIN_LENGTH + 1];
trubka (pipefds);
pid_t pid = vidlice ();
if (pid == 0)
getPIN (pin); // vygenerovat PIN
zavřít (pipefds [0]); // zavřít čtení fd
write (pipefds [1], pin, PIN_LENGTH + 1); // zapište PIN do kanálu
printf ("Generování PIN u dítěte a odeslání rodiči ... \ n");
spánek (PIN_WAIT_INTERVAL); // záměrné zpoždění generování PIN.
exit (EXIT_SUCCESS);
if (pid> 0)
počkat (NULL); // čekání na dokončení dítěte
zavřít (pipefds [1]); // zavřít zápis fd
read (pipefds [0], buffer, PIN_LENGTH + 1); // načíst PIN z kanálu
zavřít (pipefds [0]); // zavřít čtení fd
printf ("Rodič přijal PIN '% s' od dítěte.\ n \ n ", vyrovnávací paměť);
vrátit EXIT_SUCCESS;
Tento příklad je stejný jako Příklad 3. Jediný rozdíl je v tom, že tento program průběžně 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 poté 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 lze zastavit pouze stisknutím tlačítka
Takto tedy používáte systémové volání pipe () v programovacím jazyce C. Děkujeme za přečtení tohoto článku.