Potrubí je prostředkem 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 Pipe
V potrubí jsou data udržována v pořadí FIFO, což znamená zapisovat data postupně na jeden konec potrubí a číst data z jiného konce potrubí ve stejném sekvenčním pořadí.
Pokud některý proces čte z kanálu, ale žádný jiný proces do kanálu dosud nebyl zapsán, pak čtení vrátí konec souboru. Pokud proces chce zapisovat do kanálu, ale k potrubí není připojen žádný další proces pro čtení, jedná se o chybový stav a potrubí generuje signál SIGPIPE.
Soubor záhlaví
#zahrnoutSyntax
inttrubka(intpodané[2])
Argumenty
Tato funkce přebírá jeden argument, pole dvou celých čísel ( podané ). podklady [0] se používá pro čtení z potrubí, a podklady [1] slouží k zápisu do potrubí. Proces, který chce číst z kanálu, by se měl zavřít podklady [1], a proces, který chce zapsat do kanálu, by se měl zavřít podklady [0] . Pokud nepotřebné konce potrubí nejsou výslovně uzavřeny, pak konec souboru (EOF) nebude nikdy vrácen.
Návratové hodnoty
Na úspěch, trubka() vrací 0, v případě selhání funkce vrací -1.
Obrazově můžeme reprezentovat trubka() fungovat následovně:
Níže je uvedeno 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 jednom procesu není příliš užitečné, ale dostaneme nápad.
// Příklad1.c#zahrnout
#zahrnout
#zahrnout
#zahrnout
inthlavní()
{
intn;
intpodané[2];
charvyrovnávací paměť[1025];
char *zpráva= 'Ahoj světe!';
trubka(podané);
napsat(podané[1],zpráva, strlen (zpráva));
-li ((n=číst(podané[0],vyrovnávací paměť, 1024 ) ) > = 0) {
vyrovnávací paměť[n] = 0; // ukončí řetězec
printf ('read %d bytes from the pipe:'%s' n',n,vyrovnávací paměť);
}
jiný
perror ('číst');
výstup (0);
}
Zde jsme nejprve vytvořili potrubí pomocí trubka() funkce poté zapsána do kanálu pomocí slonovina [1] konec. Poté byla data načtena pomocí druhého konce potrubí, což je podklady [0] . Pro čtení a zápis do souboru jsme dříve používali čí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říklad2.c#zahrnout
#zahrnout
#zahrnout
#zahrnout
#zahrnout
inthlavní()
{
intpodané[2],nbytů;
pid_t childpid;
chartětiva[] = 'Ahoj světe! n';
charreadbuffer[80];
trubka(podané);
-li((dítě=Vidlička()) == -1)
{
perror ('Vidlička');
výstup (1);
}
-li(dítě== 0)
{
zavřít(podané[0]);// Podřízený proces tento konec kanálu nepotřebuje
/ * Odeslat 'řetězec' přes výstupní stranu potrubí */
napsat(podané[1],tětiva, ( strlen (tětiva)+1));
výstup (0);
}
jiný
{
/ * Nadřazený proces uzavře výstupní stranu potrubí */
zavřít(podané[1]);// Nadřazený proces tento konec kanálu nepotřebuje
/ * Přečíst řetězec z dýmky */
nbytů=číst(podané[0],readbuffer, velikost(readbuffer));
printf ('Přečíst řetězec: %s',readbuffer);
}
vrátit se(0);
}
Nejprve bylo pomocí funkce potrubí vytvořeno jedno potrubí a potom byl vidlicový 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 čte z kanálu a zobrazí ho. Zde je tok dat pouze jedním způsobem, který je od dítěte k rodiči.
Závěr:
trubka() je výkonné systémové volání v Linuxu. V tomto článku jsme viděli pouze jednosměrný tok dat, jeden proces zapisuje a druhý čte, čímž se vytvoří dvě kanály, které můžeme dosáhnout také obousměrného toku dat.