Ako používať funkciu potrubia v jazyku C.

How Use Pipe Function C Language



Potrubie je prostriedkom na komunikáciu medzi procesmi. Jeden proces zapisuje údaje do potrubia a druhý proces číta údaje z potrubia. V tomto článku uvidíme, ako sa funkcia pipe () používa na implementáciu konceptu pomocou jazyka C.

O Pipe

V potrubí sú údaje udržiavané v poradí FIFO, čo znamená sekvenčné zapisovanie údajov na jeden koniec potrubia a čítanie údajov z iného konca potrubia v rovnakom sekvenčnom poradí.







Ak niektorý proces číta z kanála, ale žiadny iný proces do neho ešte nebol zapísaný, funkcia read vráti koniec súboru. Ak chce proces zapisovať do potrubia, ale nie je k nemu pripojený žiadny iný proces na čítanie, jedná sa o chybový stav a potrubie generuje signál SIGPIPE.



Hlavičkový súbor

#zahrnúť

Syntax



intrúra(intpodania[2])

Argumenty

Táto funkcia preberá jeden argument, pole dvoch celých čísel ( podania ). podania [0] sa používa na čítanie z potrubia, a podklady [1] slúži na zápis do fajky. Proces, ktorý chce čítať z kanála, by sa mal zavrieť podklady [1], a proces, ktorý chce zapísať do potrubia, by sa mal zavrieť podania [0] . Ak nepotrebné konce potrubia nie sú výslovne uzavreté, potom sa koniec súboru (EOF) nikdy nevráti.





Návratové hodnoty

Pokiaľ ide o úspech, rúra() vráti 0, v prípade zlyhania funkcia vráti -1.

Obrazovo môžeme reprezentovať rúra() fungovať nasledovne:



Nasleduje niekoľko príkladov znázorňujúcich používanie funkcie potrubia v jazyku C.

Príklad 1

V tomto prípade uvidíme, ako funguje funkcia potrubia. Aj keď použitie potrubia v jednom procese nie je príliš užitočné, dostaneme nápad.

// Príklad1.c
#zahrnúť
#zahrnúť
#zahrnúť
#zahrnúť

intHlavná()
{
intn;
intpodania[2];
charnárazník[1025];
char *správu= „Ahoj, svet!“;

rúra(podania);
písať(podania[1],správu, strlen (správu));

keby ((n=čítať(podania[0],nárazník, 1024 ) ) > = 0) {
nárazník[n] = 0; // ukončenie reťazca
printf ('čítať %d bajtov z kanála:'%s' n',n,nárazník);
}
inak
hrôza ('čítať');
východ (0);
}

Tu sme najskôr vytvorili potrubie pomocou rúra() funkcia potom zapísaná do potrubia pomocou slonovinová [1] koniec. Potom boli údaje načítané pomocou druhého konca potrubia, ktorým je podania [0] . Na čítanie a zápis do súboru sme zvykli čítať() a napísať () funkcie.

Príklad 2

V tomto prípade uvidíme, ako procesy rodič a dieťa komunikujú pomocou potrubia.

// Príklad2.c
#zahrnúť
#zahrnúť
#zahrnúť
#zahrnúť
#zahrnúť

intHlavná()
{
intpodania[2],nbytov;
pid_t childpid;
charreťazec[] = „Ahoj, svet! n';
charreadbuffer[80];

rúra(podania);

keby((dieťa=vidlička()) == -1)
{
hrôza ('vidlička');
východ (1);
}

keby(dieťa== 0)
{
Zavrieť(podania[0]);// Podradený proces tento koniec potrubia nepotrebuje

/ * Odošlite 'reťazec' cez výstupnú stranu potrubia */
písať(podania[1],reťazec, ( strlen (reťazec)+1));
východ (0);
}
inak
{
/ * Nadradený proces zatvára výstupnú stranu potrubia */
Zavrieť(podania[1]);// Rodičovský proces tento koniec kanála nepotrebuje

/ * Prečítajte si reťazec z potrubia */
nbytov=čítať(podania[0],readbuffer, veľkosť(readbuffer));
printf ('Prečítajte si reťazec: %s',readbuffer);
}

vrátiť sa(0);
}

Najprv bolo pomocou funkcie potrubia vytvorené jedno potrubie a potom bol vidlicový podradený proces. Potom detský proces zatvorí koniec čítania a zapíše do kanála. Nadradený proces zatvorí koniec zápisu a načíta z kanála a zobrazí ho. Tok údajov je tu iba jedným spôsobom, od dieťaťa k rodičovi.

Záver:

rúra() je výkonné systémové volanie v systéme Linux. V tomto článku sme videli iba jednosmerný tok údajov, jeden proces zapisuje a druhý číta, pričom pri vytváraní dvoch rúrok môžeme dosiahnuť aj obojsmerný tok údajov.