Jak používat funkci potrubí v jazyce C.

How Use Pipe Function C Language



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í

#zahrnout

Syntax



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.