Potok (Unix)
Z Wikipedii
Potok (ang. pipe) – to jeden z mechanizmów komunikacji międzyprocesowej umożliwiający wymianę danych pomiędzy dwoma procesami. Odbywa się to najczęściej poprzez połączenie standardowego wyjścia jednego procesu ze standardowym wejściem drugiego.
Spis treści |
[edytuj] Potoki procesowe
W uniksowych powłokach systemowych używa się symbolu "|" (pionowej linii) aby połączyć dwa lub więcej procesów w potok.
Przykład wykorzystania potoków w systemie UNIX:
$ ps -a | sort | uniq | grep -v sh
Powyższa "konstrukcja" zwróci listę uruchomionych procesów (ps -a), posortowaną alfabetycznie (sort), niezawierającą powtórzeń (uniq), oraz bez linii zawierających wzorzec sh (grep -v sh).
Do stworzenia nienazwanego potoku służy wywołanie systemowe pipe(). Prototyp funkcji bibliotecznej znajduje się w pliku nagłówkowym unistd.h i ma następującą postać:
int pipe(int fildes[2]);
Funkcja pipe() umieszcza dwa nowe deskryptory plików w tablicy fields[] (fields[0] - deskryptor pliku tylko do odczytu, fields[1] - deskryptor pliku tylko do zapisu) i zwraca 0 w przypadku powodzenia lub -1 w przypadku błędu.
Funkcji pipe() często używa się w połączeniu z funkcją fork() w celu zapewnienia komunikacji między procesem macierzystym oraz jego procesami potomnymi.
[edytuj] Potok nazwany
Potok nazwany (lub łącze nazwane) jest to rozwinięcie idei potoku, polegające na stworzeniu specjalnego pliku, który ma służyć jako łącznik między procesami. Zapewnia to wygodny mechanizm przekazywania danych pomiędzy niespokrewnionymi ze sobą procesami.
W Uniksie do tworzenia potoków nazwanych stosuje się program mkfifo lub mknod.
$ mkfifo plik_fifo
$ mknod plik_fifo p
Z poziomu programu można skorzystać z następujących dwóch standardowych funkcji
#include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *path, mode_t mode); int mknod(const char *path, mode_t mode, dev_t dev);