Rúrka je médium na komunikáciu medzi procesmi. Jeden proces zapisuje údaje do kanálu a druhý proces číta dáta z kanálu. V tomto článku uvidíme, ako sa funkcia pipe () používa na implementáciu konceptu pomocou jazyka C.
O spoločnosti Pipe
V kanáli sa údaje udržiavajú v poradí FIFO, čo znamená postupné zapisovanie údajov na jeden koniec potrubia a čítanie údajov z druhého konca potrubia v rovnakom poradí.
Ak niektorý proces číta z informačného kanála, ale žiadny iný proces ešte nenapísal do informačného kanála, potom príkaz read vráti koniec súboru. Ak chce proces zapisovať do kanálu, ale k kanálu nie je pripojený žiadny ďalší proces na čítanie, potom ide o chybový stav a kanál generuje signál SIGPIPE.
Hlavičkový súbor
#includeSyntax
int fajka (int podklady [2])Argumenty
Táto funkcia má jediný argument, pole dvoch celých čísel (kartotéky). kartotéky [0] sa používa na čítanie z potrubia a kartotéky [1] sa používa na zápis do fajky. Proces, ktorý chce čítať z kanálu, by sa mal ukončiť kartotéky [1], a proces, ktorý chce zapisovať do kanálu, by sa mal ukončiť kartotéky [0]. Ak nepotrebné konce potrubia nie sú výslovne uzavreté, koniec súboru (EOF) sa nikdy nevráti.
Vrátiť hodnoty
O úspechu rúra() vráti 0, pri zlyhaní funkcia vráti -1.
Obrázkovo môžeme reprezentovať rúra() fungujú nasledovne:
Ďalej uvádzame niekoľko príkladov, ako používať funkciu pipe v jazyku C.
Príklad 1
V tomto príklade uvidíme, ako funguje funkcia pipe. Aj keď použitie potrubia v jednom procese nie je veľmi užitočné, dostaneme nápad.
// Príklad1.c#include
#include
#include
#include
int main ()
int n;
int kartotéky [2];
zuhoľnatý pufor [1025];
char * message = "Dobrý deň, svet!";
fajka (pilníky);
zapis (podklady [1], sprava, strlen (sprava));
if ((n = čítať (súbory [0], vyrovnávacia pamäť, 1024))> = 0)
vyrovnávacia pamäť [n] = 0; // ukončí reťazec
printf ("načítať% d bajtov z kanálu:"% s "\ n", n, vyrovnávacia pamäť);
inak
perror ("prečítať");
výstup (0);
Tu sme najskôr vytvorili potrubie pomocou rúra() funkcia potom zapísaná do kanálu pomocou fildes [1] koniec. Potom sa údaje načítali pomocou druhého konca potrubia, čo je kartotéky [0]. Na čítanie a zápis do súboru sme zvykli čítať() a napíš () funkcie.
Príklad 2
V tomto príklade uvidíme, ako nadradené a podradené procesy komunikujú pomocou potrubia.
// Príklad2.c#include
#include
#include
#include
#include
int main ()
int priečinky [2], nbytov;
pid_t childpid;
char string [] = "Dobrý deň, svet!\ n ";
char readbuffer [80];
fajka (pilníky);
if ((childpid = fork ()) == -1)
perror („vidlička“);
výstup (1);
if (childpid == 0)
close (folderses [0]); // Podradený proces tento koniec kanálu nepotrebuje
/ * Pošlite „reťazec“ cez výstupnú stranu potrubia * /
zapis (podklady [1], retazec, (strlen (retazec) +1));
výstup (0);
inak
/ * Nadradený proces uzatvára výstupnú stranu potrubia * /
close (folderses [1]); // Rodičovský proces tento koniec kanálu nepotrebuje
/ * Čítať v reťazci z fajky * /
nbytes = prečítané (súbory [0], readbuffer, sizeof (readbuffer));
printf ("Čítaný reťazec:% s", readbuffer);
návrat (0);
Najskôr sa pomocou funkcie potrubia vytvorilo jedno potrubie, potom sa rozvetvil podradený proces. Potom podradený proces uzavrie načítaný koniec a zapíše do kanálu. Nadradený proces uzavrie koniec zápisu a číta z kanálu a zobrazuje ho. Tu je tok údajov iba jedným spôsobom, ktorý je z dieťaťa na rodiča.
Záver:
rúra() je silné systémové volanie v systéme Linux. V tomto článku sme videli iba jednosmerný dátový tok, jeden proces zapisuje a druhý číta, čím sa vytvárajú dva kanály, pomocou ktorých môžeme dosiahnuť obojsmerný dátový tok.