C Programování

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

Systémové volání potrubí v C
trubka() je funkce systému Linux. The trubka() funkce systému se používá k otevření deskriptorů souborů, které se používají ke komunikaci mezi různými procesy systému Linux. 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. Pojďme tedy začít.

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:

#zahrnout

Další 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.

#zahrnout

Pak 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 + 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.

V systému Windows 10 nefunguje levé tlačítko myši
Pokud používáte speciální myš s notebookem nebo stolním počítačem, ale levé tlačítko myši nefunguje ve Windows 10/8/7 z nějakého důvodu uvádíme několi...
Kurzor při psaní v systému Windows 10 skáče nebo se pohybuje náhodně
Pokud zjistíte, že kurzor myši skáče nebo se pohybuje sám, automaticky, náhodně při psaní v notebooku nebo počítači se systémem Windows, pak vám někte...
Jak obrátit směr posouvání myši a touchpadu ve Windows 10
Myš a Touchpadnejenže usnadňují výpočet, ale jsou efektivnější a méně časově náročné. Nemůžeme si představit život bez těchto zařízení, ale přesto je ...