4Potoki - Theorethical Physics Departmentsth.if.uj.edu.pl/~atg/SO/Potoki.pdf · c Wieslaw Placzek...

4
c Wies law P laczek 14 4 Potoki 4.1 Wprowadzenie Potok (ang. pipe) mo˙ zna uzna´ c za plik specjalnego typu, kt´ory s lu˙ zy do przechowy- wania ograniczonej ilo´ sci danych i do kt´ orego dost , ep mo˙ ze si , e odbywa´ c jedynie w try- bie FIFO (ang. first-in–first-out – element umieszczony w buforze pierwszy, r´ ownie˙ z pierwszy opu´ sci bufor). Maksymalna liczba bajt´ ow, jak , a mo˙ zna zapisa´ cw potoku, jest okre´ slona sta l , a PIPE BUF, kt´ orej definicja znajduje si , e w pliku nag l´owkowym <limits.h> lub <sys/param.h>. Potoki zapewniaj , a prosty synchroniczny spos´ob wymiany danych mi , edzy procesami. Dane zapisywane s , a na jedym ko´ ncu potoku,a odczytywane na drugim jego ko´ ncu, przy czym odczytane dane s , az potoku usuwane. System zapewnia synchronizacj , e mi , edzy procesem zapisuj , acym i odczytuj , acym. Domy- ´ slnie, je´ sli ten pierwszy spr´ obuje zapisa´ c dane do pelnego potoku , to zostanie przez system automatycznie zablokowany do czasu, gdy potok b , edzie w stanie je odebra´ c. Podobnie proces odczytuj , acy, kt´ ory podejmie pr´ ob , e pobrania danych z pustego potoku, zostanie zablokowany do czasu, kiedy pojawi , a si , e jakie´ s dane. Do zablokowania dojdzier´ownie˙ z wtedy, gdy potok zostanie otwarty przez jeden proces do odczytu, ale nie zostanie otwarty przez inny proces do zapisu. Dane mo˙ zna zapisawa´ c do potoku za pomoc , a funkcji write,a odczytywa´ c z niego za pomoc , a funkcji read (niebuforowane funkcje wej´ scia/wyj´ scia). Pliki w l , aczane <unistd.h> Prototyp ssize t write(int filedes, const void *buf, size t nbyte); Zwracana Sukces Pora˙ zka Czy zmienia errno warto´ c Liczba zapisanych bajt´ow -1 Tak Funkcja write podejmujepr´ob , e zapisania nbyte bajt´ow danych wskazywanych przez para- metr buf do pliku okre´ slonego deskryptorem filedes. Je´ sli funkcja write zako´ nczy si , e sukcesem, to zwr´oci liczb , e rzeczywi´ scie zapisanych bajt´ ow. Pliki w l , aczane <unistd.h> Prototyp ssize t read(int filedes, void *buf, size t nbyte); Zwracana Sukces Pora˙ zka Czy zmienia errno warto´ c Liczba odczytanych bajt´ ow -1 Tak Funkcja read odczytuje nbyte bajt´ow danych z pliku o desktryptorze filedes i umie- szcza je w miejscu pami , eci okre´ slonym wska´ znikiem buf. Pozytywnie zako´ nczona, zwraca liczb , e rzeczywi´ scie odczytanych bajt´ow. W przypadku doj´ scia do ko´ nca pliku zwracana jest warto´ c 0. ) Co to jest deskryptor pliku? W systemie UNIX z ka˙ zdym otwartym przez proces plikiem zwi , azana jest pewna nie- ujemna liczba calkowita zwana deskryptorem pliku. Deskryptory o numerach 0, 1 i 2

Transcript of 4Potoki - Theorethical Physics Departmentsth.if.uj.edu.pl/~atg/SO/Potoki.pdf · c Wieslaw Placzek...

Page 1: 4Potoki - Theorethical Physics Departmentsth.if.uj.edu.pl/~atg/SO/Potoki.pdf · c Wieslaw Placzek 13 zwiazane s, aodpowiednioze, standardowymi strumieniami: wej´scia, wyj´scia i

c� Wies law P laczek 14

4 Potoki

4.1 Wprowadzenie

Potok (ang. pipe) mozna uznac za plik specjalnego typu, ktory s luzy do przechowy-wania ograniczonej ilosci danych i do ktorego dost ,ep moze si ,e odbywac jedynie w try-bie FIFO (ang. first-in–first-out – element umieszczony w buforze pierwszy, rowniezpierwszy opusci bufor). Maksymalna liczba bajtow, jak ,a mozna zapisac w potoku, jestokreslona sta l ,a PIPE BUF, ktorej definicja znajduje si ,e w pliku nag lowkowym <limits.h>lub <sys/param.h>. Potoki zapewniaj ,a prosty synchroniczny sposob wymiany danych

mi ,edzy procesami. Dane zapisywane s ,a na jedym koncu potoku, a odczytywane na drugim

jego koncu, przy czym odczytane dane s ,a z potoku usuwane.System zapewnia synchronizacj ,emi ,edzy procesem zapisuj ,acym i odczytuj ,acym. Domy-

slnie, jesli ten pierwszy sprobuje zapisac dane do pe lnego potoku, to zostanie przez systemautomatycznie zablokowany do czasu, gdy potok b ,edzie w stanie je odebrac. Podobnieproces odczytuj ,acy, ktory podejmie prob ,e pobrania danych z pustego potoku, zostaniezablokowany do czasu, kiedy pojawi ,a si ,e jakies dane. Do zablokowania dojdzie rowniezwtedy, gdy potok zostanie otwarty przez jeden proces do odczytu, ale nie zostanie otwartyprzez inny proces do zapisu.

Dane mozna zapisawac do potoku za pomoc ,a funkcji write, a odczytywac z niego zapomoc ,a funkcji read (niebuforowane funkcje wejscia/wyjscia).

Pliki w l ,aczane <unistd.h>

Prototyp ssize t write(int filedes, const void *buf, size t nbyte);

Zwracana Sukces Porazka Czy zmienia errnowartosc Liczba zapisanych bajtow �1 Tak

Funkcja write podejmuje prob ,e zapisania nbyte bajtow danych wskazywanych przez para-metr buf do pliku okreslonego deskryptorem filedes. Jesli funkcja write zakonczy si ,esukcesem, to zwroci liczb ,e rzeczywiscie zapisanych bajtow.

Pliki w l ,aczane <unistd.h>

Prototyp ssize t read(int filedes, void *buf, size t nbyte);

Zwracana Sukces Porazka Czy zmienia errnowartosc Liczba odczytanych bajtow �1 Tak

Funkcja read odczytuje nbyte bajtow danych z pliku o desktryptorze filedes i umie-szcza je w miejscu pami ,eci okreslonym wskaznikiem buf. Pozytywnie zakonczona, zwracaliczb ,e rzeczywiscie odczytanych bajtow. W przypadku dojscia do konca pliku zwracanajest wartosc 0.) Co to jest deskryptor pliku?

W systemie UNIX z kazdym otwartym przez proces plikiem zwi ,azana jest pewna nie-ujemna liczba ca lkowita zwana deskryptorem pliku. Deskryptory o numerach 0, 1 i 2

Page 2: 4Potoki - Theorethical Physics Departmentsth.if.uj.edu.pl/~atg/SO/Potoki.pdf · c Wieslaw Placzek 13 zwiazane s, aodpowiednioze, standardowymi strumieniami: wej´scia, wyj´scia i

c� Wies law P laczek 15

zwi ,azane s ,a odpowiednio ze standardowymi strumieniami: wejscia, wyjscia i wyjscia

b l ,edow. Deskryptory s luz ,a do odwo lywania si ,e do plikow przez niektore funkcje syste-mowe. Deskryptory plikow procesu macierzystego s ,a dziedziczone przez procesy potomne.Liczba deskryptorow, ktore mog ,a byc dost ,epne procesowi jest ograniczona. W starszychwersjach Uniksa nie mog la ona przekroczyc 20, w nowszych wersjach liczba ta moze bycznacznie wi ,eksza (mozna j ,a sprawdzic przy pomocy komendy ulimit -n pow loki bash).Deskryptor pliku mozna utworzyc np. przy pomocy funkcji systemowej open.

Pliki w l ,aczane <sys/types.h>, <sys/stat.h>, <fcntl.h>

Prototyp int open(const char *path, int flags, mode t mode);

Zwracana Sukces Porazka Czy zmienia errnowartosc Deskryptor pliku �1 Tak

Pomyslnie wykonana funkcja open otwiera plik i zwraca jego deskryptor.

• Parametry:path sciezkowa nazwa pliku,flags opcje,mode prawa dost ,epu do pliku, np. 0644.

• Opcje flags (wazniejsze):

O RDONLY otworz plik do czytania,O WRONLY otworz plik do pisania,O RDWR otworz plik do czytania i pisania,O CREAT jesli plik nie istnieje, to stworz go,O EXCL przy rownoczesnie ustawionej fladze O CREAT przekaz b l ,ad, jesli plik juz

istnieje,O TRUNC jesli plik istnieje, zmniejsz jego d lugosc do zera (obetnij go),O APPEND otworz plik w trybie dopisywania na jego koncu.

Opcje mozna l ,aczyc przy pomocy sumy bitowej, np. O WRONLY | O CREAT | O TRUNC.Deskryptor przypisany do pliku mozna zwolnic uzywaj ,ac funkcji systemowej close.

Pliki w l ,aczane <unistd.h>

Prototyp int close(int filedes);

Zwracana Sukces Porazka Czy zmienia errnowartosc 0 �1 Tak

Pomyslnie zakonczona funkcja close zamyka plik, tzn. zwalnia uzywany przez niego de-skryptor. Dzi ,eki temu deskryptor ten moze byc uzyty ponownie jeszcze przed zakoncze-niem wykonywania procesu. W chwili zakonczenia wykonywania procesu, wszystkie uzy-wane przez ten proces pliki s ,a automatycznie zamykane. Do dobrego stylu programo-wania nalezy jednak jawne zamykanie plikow, ktore nie s ,a juz potrzebne (jak wiadomo,porz ,adek w programie jest nie tylko kwesti ,a estetyki, ale cz ,esto pozwala unikn ,ac roznychproblemow, szczegolnie przy dalszym rozwoju programu). Funkcj ,e close mozna stosowacrowniez do deskryptorow o numerach 0, 1 i 2, tzn. standardowych strumieni WE/WY.

Page 3: 4Potoki - Theorethical Physics Departmentsth.if.uj.edu.pl/~atg/SO/Potoki.pdf · c Wieslaw Placzek 13 zwiazane s, aodpowiednioze, standardowymi strumieniami: wej´scia, wyj´scia i

c� Wies law P laczek 16

Plik mozna usun ,ac przy pomocy funkcji systemowej unlink.

Pliki w l ,aczane <unistd.h>

Prototyp int unlink(const char *path);

Zwracana Sukces Porazka Czy zmienia errnowartosc 0 �1 Tak

Funkcja unlink, pomyslnie zakonczona, usuwa dowi ,azanie do pliku o nazwie sciezkowejpath z katalogu oraz zmniejsza o 1 licznik dowi ,azan do tego pliku przechowywany w i-w ,ezle(ang. i-node) – jesli licznik ten przyjmie wartosc 0, to plik zostanie usuni ,ety.

4.2 Potoki nienazwane

Potoki nienazwane mog ,a l ,aczyc tylko procesy pokrewne, np. macierzysty i potomny,dwoch ,,braci”, ,,dziadka” i ,,wnuka”, itd. Do ich tworzenia s luzy funkcja systemowa pipe.

Pliki w l ,aczane <unistd.h>

Prototyp int pipe(int filedes[2]);

Zwracana Sukces Porazka Czy zmienia errnowartosc 0 �1 Tak

W przypadku poprawnego wykonania, funkcja pipe zwraca dwa deskryptory plikow:filedes[0] i filedes[1], ktore odnosz ,a si ,e do dwoch strumieni danych. W obecnychwersjach systemu UNIX, funkcja pipe nierzadko wyst ,epuje w dwoch odmianach. Jednaz nich s luzy do tworzenia potokow jednokierunkowych (po ldupleks), a druga do tworzeniapotokow dwukierunkowych (pe lny dupleks). To, ktora z nich jest wywo lywana domyslnie,zalezy od ustawien systemowych – najlepiej sprawdzic to w man pipe. W pe lnym duplek-

sie plik filedes[0] s luzy do zapisu danych, a filedes[1] do ich odczytu i odwrotnie.Natomiast w konfiguracji po ldupleksowej plik filedes[1] jest zawsze uzywany do za-

pisu, a filedes[0] zawsze do odczytu – proba uzycia ich na odwrot konczy si ,e b l ,edem.Uwaga: Proces powinien zamykac (najlepiej na samym pocz ,atku) koniec potoku, ktoregonie b ,edzie uzywa l (tzn. zwalniac odpowiedni desktryptor funkcj ,a close).

CWICZENIE 4: Producent–Konsument: Potoki Nienazwane

Przy pomocy potokow nienazwanych systemu UNIX zaimplementowac problem ,,Pro-

ducenta i Konsumenta”. Dla zademonstrowania, ze nie dosz lo do utraty ani zwielokrot-nienia towaru, niech Producent pobiera ,,surowiec” (np. porcje bajtow) z pliku tekstowego

i wstawia go jako towar do potoku, a Konsument niech umieszcza pobrany z potoku

towar w innym pliku tekstowym. Po zakonczeniu dzia lania programow (wyczerpaniu za-sobow ,,surowca”) oba pliki tekstowe powinny byc identyczne. Oba procesy niech drukuj ,aodpowiednie komunikaty na ekranie, w tym towar, ktory przesy laj ,a. Do zasymulowa-nia roznych szybkosci dzia lania programow uzyc funkcji sleep, np. z losowym czasemusypiania.

Page 4: 4Potoki - Theorethical Physics Departmentsth.if.uj.edu.pl/~atg/SO/Potoki.pdf · c Wieslaw Placzek 13 zwiazane s, aodpowiednioze, standardowymi strumieniami: wej´scia, wyj´scia i

c� Wies law P laczek 17

4.3 Potoki nazwane (potoki FIFO)

Drugi rodzaj potokow wyst ,epuj ,acych w systemie UNIX stanowi ,a potoki nazwane (okres-lane takze mianem potokow FIFO). Rozni ,a si ,e one od potokow nienazwanych g lownietym, ze towarzysz ,a im wpisy w wykazach plikow odpowiednich katalogow. Zatem w pro-gramach mog ,a byc traktowane jak zwyk le pliki. Dzi ,eki temu potoki FIFO mog ,a l ,aczycniezalezne procesy, a nie tylko pokrewne jak w przypadku potokow nienazwanych. Do-datkowo potoki FIFO mozna tworzyc nie tylko z poziomu programu, ale rowniez z poziomu

pow loki (z linii polecen). Dzi ,eki temu potokow FIFO mozna latwo uzywac w programachpisanych nie tylko w j ,ezykach C/C++, ale w dowolnych j ,ezykach, ktore posiadaj ,a operacjeczytania/pisania w plikach.

Do tworzenia potokow FIFO z linii komend s luzy polecenie mkfifo3. Sk ladnia tegopolecenia jest nast ,epuj ,aca:

mkfifo [-m mode] file namegdzie file name jest nazw ,a pliku specjalnego FIFO, ktory b ,edzie uzywany jako potok

FIFO, a (opcjonalny) mode oznacza prawa dost ,epu (jak dla zwyk lego pliku, np. 644). Plikspecjalny FIFO w wykazie zawartosci katalogu (komenda ls -l) jest oznaczony liter ,a p(od pipe) w pierwszej kolumnie atrybutow pliku.

Z poziomu programu potoki FIFO mozna tworzyc przy pomocy funkcji bibliotecznejmkfifo4.

Pliki w l ,aczane <sys/types.h>, <sys/stat.h.>

Prototyp int mkfifo(const char *path, mode t mode);

Zwracana Sukces Porazka Czy zmienia errnowartosc 0 �1 Tak

Funkcja mkfifo tworzy potok FIFO o nazwie sciezkowej path i prawach dost ,epu okreslonychparametrem mode – w systemie osemkowym, np. 0644.

CWICZENIE 5: Producent–Konsument: Potoki Nazwane

Przy pomocy potokow nazwanych systemu UNIX zaimplementowac problem ,,Pro-

ducenta i Konsumenta” z cwiczenia 4.

(a) Utworzyc potok FIFO z poziomu programu, a nast ,epnie uruchomic procesy Produ-centa i Konsumenta w tym samym programie (w procesie macierzystym i potomnymlub w dwoch potomnych).

(b) Sprawdzic, ze potoki FIFO dzia laj ,a dla niezaleznych procesow przez utworzenie po-toku FIFO z linii komend oraz uruchomienie procesow Producenta i Konsumentaniezaleznie z poziomu pow loki, np. w roznych terminalach.

3Istnieje rowniez bardziej ogolne polecenie o nazwie mknod do tworzenia tzw. plikow specjalnych, w

tym m.in. potokow FIFO – szczego ly mozna znalezc w man mknod.4Istnieje takze funkja systemowa mknod – odpowiednik polecenia mknod (patrz: man 2 mknod).