C Programovanie

Systémové volanie potrubia v C

Systémové volanie potrubia v C
rúra() je funkcia systému Linux. The rúra() funkcia systému sa používa na otvorenie deskriptorov súborov, ktoré sa používajú na komunikáciu medzi rôznymi procesmi systému Linux. Stručne povedané, rúra() Táto funkcia sa používa na medziprocesovú komunikáciu v systéme Linux.  V tomto článku vám ukážem, ako používať funkciu systému pipe () v systéme Linux. Takže poďme na to.

Funkcia Všetko o potrubí ():

Syntax súboru rúra() funkcia je:

int fajka (int pipefd [2]);

Funkcia pipe () tu vytvára jednosmerný dátový kanál pre komunikáciu medzi procesmi. Vložíte do int (Integer) pole typu pipefd skladajúci sa z 2 prvkov poľa do funkčnej rúry (). Potom funkcia pipe () vytvorí dva deskriptory súborov v pipefd pole.

Prvý prvok pipefd pole, pipefd [0] sa používa na čítanie údajov z kanálu.

Druhým prvkom pipefd pole, pipefd [1] sa používa na zápis údajov do kanálu.

Pri úspechu funkcia pipe () vráti 0. Ak sa počas inicializácie kanálu vyskytne chyba, funkcia pipe () vráti -1.

Funkcia pipe () je definovaná v hlavičke unistd.h. Ak chcete vo svojom programe C používať funkciu pipe (), musíte zahrnúť hlavičku unistd.h nasledovne:

#include

Ďalšie informácie o funkcii systému pipe () nájdete na manuálovej stránke pipe () pomocou nasledujúceho príkazu:

$ man 2 fajky
Manuálna stránka pipe ().

Príklad 1:

Pre prvý príklad vytvorte nový zdrojový súbor C 1_pipe.c a zadajte nasledujúce riadky kódov.

#include
#include
#include
 
int main (void)
int pipefds [2];
 
if (potrubie (pipefds) == -1)
perror ("fajka");
výstup (EXIT_FAILURE);

 
printf ("Hodnota deskriptora načítania súboru:% d \ n", pipefds [0]);
printf ("Hodnota deskriptora zápisu súboru:% d \ n", pipefds [1]);
 
návrat EXIT_SUCCESS;

Sem som zahrnul hlavičkový súbor pipe () unistd.h najskôr nasledujúcim riadkom.

#include

Potom v hlavný() funkciu som definoval pipefds dvojprvkové celé číslo s nasledujúcim riadkom.

int pipefds [2];

Potom som spustil funkciu pipe () na inicializáciu poľa deskriptorov súborov pipefds nasledovne.

fajka (pipefds)

Tiež som skontroloval chyby pomocou návratovej hodnoty funkcie pipe (). Použil som východ() funkcia na ukončenie programu v prípade, že zlyhá funkcia pipe.

if (potrubie (pipefds) == -1)
perror ("fajka");
výstup (EXIT_FAILURE);

Potom som vytlačil hodnotu deskriptorov súborov čítania a zápisu pipefds [0] a pipefds [1] resp.

printf ("Hodnota deskriptora načítania súboru:% d \ n", pipefds [0]);
printf ("Hodnota deskriptora zápisu súboru:% d \ n", pipefds [1]);

Ak program spustíte, mal by sa zobraziť nasledujúci výstup. Ako vidíte, hodnota deskriptora súboru načítaného potrubia pipefds [0] je 3 a napíš deskriptor súboru potrubia pipefds [1] je 4.

Príklad 2:

Vytvorte ďalší zdrojový súbor C 2_pipe.c a zadajte nasledujúce riadky kódov.

#include
#include
#include
#include
 
int main (void)
int pipefds [2];
zuhoľnatený nárazník [5];
 
if (potrubie (pipefds) == -1)
perror ("fajka");
výstup (EXIT_FAILURE);

 
char * pin = "4128 \ 0";
 
printf ("Zápis PIN do správy ...";
write (pipefds [1], pin, 5);
printf ("Hotovo.\ n \ n ");
 
printf ("Čítanie PIN z kanálu ... \ n");
read (pipefds [0], buffer, 5);
printf ("Hotovo.\ n \ n ");
 
printf ("PIN z kanálu:% s \ n", vyrovnávacia pamäť);
 
návrat EXIT_SUCCESS;

Tento program vám v podstate ukáže, ako zapisovať do informačného kanála a čítať údaje, ktoré ste z informačného kanála napí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 * pin = "4128 \ 0";

Každý znak ASCII má veľkosť 1 bajt v jazyku C. Ak teda chcete odoslať štvormiestny kód PIN potrubím, musíte do potrubia napísať 5 bajtov (4 + 1 znak NULL) údajov.

Na zápis 5 bajtov údajov (špendlík) do potrubia, použil som napíš () funkcia pomocou deskriptoru súboru zápisu pipefds [1] nasledovne.

write (pipefds [1], pin, 5);

Teraz, keď mám v rúre nejaké dáta, môžem ich z rúry načítať pomocou čítať() funkcia na deskriptore súboru načítaného potrubia pipefds [0]. Ako som napísal 5 bajtov údajov (špendlík) do potrubia, budem tiež čítať 5 bajtov údajov z potrubia. Načítané údaje sa uložia do súboru nárazník pole znakov. Pretože budem čítať 5 bajtov dát z potrubia, nárazník pole znakov musí byť minimálne 5 bajtov dlhé.

Definoval som nárazník pole znakov na začiatku súboru hlavný() funkcia.

zuhoľnatený nárazník [5];

Teraz môžem prečítať PIN z potrubia a uložiť ho do nárazník pole s nasledujúcim riadkom.

read (pipefds [0], buffer, 5);

Teraz, keď som prečítal PIN z fajky, môžem ho vytlačiť pomocou printf () fungujú ako obvykle.

printf ("PIN z potrubia:% s \ n", vyrovnávacia pamäť);

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 napíš do nasledujúcich riadkov kódov.

#include
#include
#include
#include
#include
int main (void)
int pipefds [2];
char * špendlík;
zuhoľnatý nárazník [5];
 
if (potrubie (pipefds) == -1)
perror ("fajka");
výstup (EXIT_FAILURE);

 
pid_t pid = vidlica ();
 
if (pid == 0) // v podradenom procese
pin = "4821 \ 0"; // PIN na odoslanie
zavrieť (pipefds [0]); // zavrieť čítať fd
write (pipefds [1], pin, 5); // napíš PIN do fajky
 
printf ("Generovanie PIN u dieťaťa a odoslanie rodičovi ... \ n");
spánok (2); // úmyselné oneskorenie
výstup (EXIT_SUCCESS);

 
if (pid> 0) // v hlavnom procese
počkaj (NULL); // čakať na ukončenie podradeného procesu
zavrieť (pipefds [1]); // zavrieť napíš fd
read (pipefds [0], buffer, 5); // prečítaj PIN z fajky
zavrieť (pipefds [0]); // zavrieť čítať fd
 
printf ("Rodic prijal PIN '% s' \ n", vyrovnávacia pamäť);

 
návrat EXIT_SUCCESS;

V tomto príklade som vám ukázal, ako používať potrubie na komunikáciu medzi procesmi. Poslal som PIN z procesu dieťaťa do procesu rodiča pomocou potrubia. Potom prečítajte PIN z potrubia v nadradenom procese a vytlačte ho z nadradeného procesu.

Najskôr som vytvoril podradený proces pomocou funkcie fork ().

pid_t pid = vidlica ();

Potom v procese dieťaťa (pid == 0), Napísal som PIN do potrubia pomocou napíš () funkcia.

write (pipefds [1], pin, 5);

Akonáhle je PIN napísaný do kanálu z podradeného procesu, nadradený proces (pid> 0) odčítajte z potrubia pomocou čítať() funkcia.

read (pipefds [0], buffer, 5);

Potom nadradený proces vytlačil PIN pomocou printf () fungujú ako obvykle.

printf ("Rodic prijal PIN '% s' \ n", vyrovnávacia pamäť);

Ako vidíte, spustenie programu poskytne očakávaný výsledok.

Príklad 4:

Vytvorte nový zdrojový súbor C 4_pipe.c ako napíš do nasledujúcich riadkov kódov.

#include
#include
#include
#include
#include
 
#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2
 
void getPIN (char pin [PIN_LENGTH + 1])
srand (getpid () + getppid ());
 
pin [0] = 49 + rand ()% 7;
 
pre (int i = 1; i < PIN_LENGTH; i++)
pin [i] = 48 + rand ()% 7;

 
špendlík [PIN_LENGTH] = '\ 0';

 
 
int main (void)
while (1)
int pipefds [2];
char pin [PIN_LENGTH + 1];
char buffer [PIN_LENGTH + 1];
 
fajka (pipefds);
 
pid_t pid = vidlica ();
 
if (pid == 0)
getPIN (pin); // vygenerovať PIN
zavrieť (pipefds [0]); // zavrieť čítať fd
write (pipefds [1], pin, PIN_LENGTH + 1); // napíš PIN do fajky
 
printf ("Generovanie PIN u dieťaťa a odoslanie rodičovi ... \ n");
 
spánok (PIN_WAIT_INTERVAL); // zámerné oneskorenie generovania PIN.
 
výstup (EXIT_SUCCESS);

 
if (pid> 0)
počkaj (NULL); // čakanie na dokončenie dieťaťa
 
zavrieť (pipefds [1]); // zavrieť napíš fd
read (pipefds [0], buffer, PIN_LENGTH + 1); // prečítaj PIN z fajky
zavrieť (pipefds [0]); // zavrieť čítať fd
printf ("Rodič prijal PIN '% s' od dieťaťa.\ n \ n ", medzipamäť);


 
návrat EXIT_SUCCESS;

Tento príklad je rovnaký ako Príklad 3. Jediný rozdiel je v tom, že tento program nepretržite vytvára podradený proces, generuje PIN v podradenom procese a odosiela PIN nadradenému procesu pomocou prepojky.

Nadradený proces potom načíta kód PIN z kanálu 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žívate systémové volanie pipe () v programovacom jazyku C. Ďakujeme, že ste si prečítali tento článok.

Hry Nainštalujte si najnovšiu strategickú hru OpenRA na Ubuntu Linux
Nainštalujte si najnovšiu strategickú hru OpenRA na Ubuntu Linux
OpenRA je herný engine Libre / Free Real Time Strategy, ktorý obnovuje rané hry z Westwoodu, ako napríklad klasické Command & Conquer: Red Alert. Dist...
Hry Nainštalujte si najnovší Dolphin Emulator pre Gamecube a Wii na Linuxe
Nainštalujte si najnovší Dolphin Emulator pre Gamecube a Wii na Linuxe
Emulátor Dolphin vám umožní hrať vybrané hry Gamecube a Wii na osobných počítačoch Linux (PC). Emulátor Dolphin, ktorý je voľne dostupným emulátorom ...
Hry Ako používať GameConqueror Cheat Engine v Linuxe
Ako používať GameConqueror Cheat Engine v Linuxe
Tento článok obsahuje sprievodcu používaním cheatovacieho modulu GameConqueror v systéme Linux. Mnoho používateľov, ktorí hrajú hry v systéme Windows,...