Trubka je médium pro komunikaci mezi procesy. Jeden proces zapisuje data do kanálu a jiný proces čte data z kanálu. V tomto článku uvidíme, jak se funkce pipe () používá k implementaci konceptu pomocí jazyka C.
O společnosti Pipe
V kanálu se data udržují v pořadí FIFO, což znamená postupné zapisování dat na jeden konec kanálu a čtení dat z jiného konce kanálu ve stejném pořadí.
Pokud jakýkoli proces čte z kanálu, ale žádný jiný proces ještě do kanálu nenapsal, pak read vrátí konec souboru. Pokud chce proces zapisovat do kanálu, ale k kanálu není připojen žádný jiný proces pro čtení, pak se jedná o chybový stav a kanál generuje signál SIGPIPE.
Soubor záhlaví
#zahrnoutSyntax
int potrubí (int pilníky [2])Argumenty
Tato funkce přebírá jediný argument, pole dvou celých čísel (kartotéky). kartotéky [0] se používá ke čtení z kanálu a kartotéky [1] se používá pro zápis do kanálu. Proces, který chce číst z kanálu, by se měl zavřít kartotéky [1], a proces, který chce zapisovat do kanálu, by se měl zavřít kartotéky [0]. Pokud zbytečné konce kanálu nejsou výslovně uzavřeny, pak se konec souboru (EOF) nikdy nevrátí.
Návratové hodnoty
O úspěchu trubka() vrací 0, při selhání funkce vrací -1.
Obrazově můžeme představovat trubka() funkce takto:
Níže uvádíme několik příkladů, jak používat funkci potrubí v jazyce C.
Příklad 1
V tomto příkladu uvidíme, jak funguje funkce potrubí. Ačkoli použití potrubí v jediném procesu není příliš užitečné, získáme představu.
// Příklad 1.C#zahrnout
#zahrnout
#zahrnout
#zahrnout
int main ()
int n;
int pilníky [2];
char buffer [1025];
char * message = "Dobrý den, svět!";
trubka (pilníky);
write (folders [1], message, strlen (message));
if ((n = čtení (folders [0], buffer, 1024))> = 0)
vyrovnávací paměť [n] = 0; // ukončí řetězec
printf ("načíst% d bajtů z kanálu:"% s "\ n", n, vyrovnávací paměť);
jiný
perror ("číst");
exit (0);
Zde jsme nejprve vytvořili potrubí pomocí trubka() funkce pak zapsána do kanálu pomocí fildes [1] konec. Poté byla data načtena pomocí druhého konce kanálu, což je kartotéky [0]. Pro čtení a zápis do souboru jsme zvyklí číst() a napsat() funkce.
Příklad 2
V tomto příkladu uvidíme, jak nadřazené a podřízené procesy komunikují pomocí kanálu.
// Příklad 2.C#zahrnout
#zahrnout
#zahrnout
#zahrnout
#zahrnout
int main ()
int folders [2], nbytes;
pid_t childpid;
char string [] = "Dobrý den, svět!\ n ";
char readbuffer [80];
trubka (pilníky);
if ((childpid = fork ()) == -1)
perror ("vidlice");
výstup (1);
if (childpid == 0)
close (folderses [0]); // Podřízený proces tento konec kanálu nepotřebuje
/ * Odeslat "řetězec" výstupní stranou potrubí * /
write (folders [1], string, (strlen (string) +1));
exit (0);
jiný
/ * Nadřazený proces uzavírá výstupní stranu potrubí * /
close (folderses [1]); // Rodičovský proces tento konec kanálu nepotřebuje
/ * Číst v řetězci z kanálu * /
nbytes = read (folders [0], readbuffer, sizeof (readbuffer));
printf ("Číst řetězec:% s", readbuffer);
návrat (0);
Nejprve byla vytvořena jedna roura pomocí funkce roury, poté byl rozvětven podřízený proces. Potom podřízený proces zavře konec čtení a zapíše do kanálu. Nadřazený proces zavře konec zápisu a načte z kanálu a zobrazí jej. Tok dat je pouze jedním způsobem, který je od dítěte k rodiči.
Závěr:
trubka() je silné systémové volání v Linuxu. V tomto článku jsme viděli pouze jednosměrný datový tok, jeden proces zapisuje a další proces čte, čímž vznikají dva kanály, které můžeme dosáhnout také obousměrný datový tok.