ª¡cza nazwane.
Transkrypt
ª¡cza nazwane.
Laboratorium z systemów operacyjnych ¡cza komunikacyjne II - ª¡cza nazwane. Anna Wojak 1 Zagadnienia do samodzielnego przygotowania: • ª¡cze komunikacyjne i ich charakteryzacja, potok nazwany, • cechy potoków nazwanych, dziedziczenie deskryptorów otwartch plików od procesu macierzystego, • i-w¦zeª, PIPE_BUF, dowi¡zania twarde, dowiazania mi¦kkie, umask. 1 ¡cza nazwane - funkcje systemowe. Kolejki FIFO - inaczej nazywane potokami nazwanymi, s¡ plikami specjalnego rodzaju, które istniej¡ pod podan¡ nazw¡ w systemie plików. Zachowuj¡ si¦ one podobnie do potoków nienazwanych utworzonych za pomoc¡ funkcji pipe. Dzi¦ki kolejkom fo istnieje w systemie komunikacja miedzy procesami nie zwi¡zanymi ze sob¡. Jeden z procesów otwiera plik FIFO do zapisu, drugi do odczytu, po czym dane mog¡ przepªywa¢ przez kolejk¦ jak przez zwykªy potok nienazwany. Do tworzenia ª¡cza oraz komunikacji pomiedzy procesami za pomoc¡ tego» ª¡cza sªu»¡ nast¦puj¡ce funkcje: mkfo() int mkfo ( char * path, mode_t mode ) • funkcja tworzy plik typu kolejka FIFO, • pierwszy argument path jest nazw¡ kolejki wraz z ±cie»k¡ gdzie zostanie utworzona, • drugi argument okre±la uprawnienia wªa±ciciela potoku, grupy i innych u»ytkowników (prawa dostepu), • uprawnienia musz¡ zawiera¢ zarówno pozwolenie na zapis, jak i na odczyt, • okre±lanie praw dost¦pu jest modykowane przez ustawienia maski u»ytkownika, • w przypadku poprawnego wykonania funkcji zwracana jest warto±¢ 0, natomiast w przypadku bª¦du -1, • mo»liwe kody bª¦dów: EXIST - plik o podanej nazwie ju» istnieje, u»yto ag O_CREAT i O_EXCL, EFAULT - nazwa path wskazuje poza dost¦pn¡ przestrze« adresow¡, EACCES - »¡dany dost¦p do pliku nie jest dozwolony, ENFILE - osi¡gni¦to limit otwartych plików w systemie, EMFILE - proces ju» otworzyª dozwolon¡ maksymaln¡ liczb¦ plików, EROFS - »¡dane jest otwarcie w trybie zapisu pliku b¦d¡cego plikiem tylko do odczytu, • do rozpocz¦cia komunikacji za pomoc¡ kolejki jeden program musi otworzy¢ j¡ do zapisu, a drugi do odczytu, wykorzystuj¡c niskopoziomowe funkcje open, close, • po utworzeniu i otworzeniu kolejki mozemy zapisywac i odczytywa¢ z niej dane u»ywaj¡c funkcji systemowych write, read (omówionych na poprzednich zaj¦ciach), • do kolejki mo»e pisac i czytac wiele procesów cho¢ jej rozmiar jest ograniczony. Ilo±¢ danych, jakie mog¡ znajdowa¢ si¦ w kolejce w danym momencie okre±la staªa PIPE_BUF, której wielko±¢ mo»na sprawdzi¢ w pliku nagªówkowym <limits.h>. W systemach unixowych jest to 4096 bajtów. • zastosowaniem kolejki FIFO jest przesyªanie danych mi¦dzy klientem a serwerem: 2 Rysunek 1: Schemat komunikacji przez kolejk¦ FIFO serwer tworzy kolejk¦ FIFO klienci wysyªaj¡ komunikaty do serwera za po±rednictwem znanej nazwy kolejki, serwer czyta dane z kolejki, nale»y pami¦ta¢ o rozmiarze wysyªanych danych - aby nie ulegªy wymieszaniu nie mog¡ przekroczy¢ rozmiaru PIPE_BUF. open() int open (char*pathname,intmode, int ags) • poprawne wykonanie funkcji zwraca deskryptor kolejki FIFO, • w przypadku wyst¡pienia bª¦du -1, • pierwszy argument pathname okre±la nazw¦ ±cie»kow¡ pliku specjalnego b¦d¡cego kolejk¡ fo, • drugi argument mode okre±la prawa dost¦pu do ª¡cza, • agi: 3 O_RDONLY - funkcja blokuje si¦ do momentu, a» inny proces nie otworzy kolejki FIFO do zapisu, O_WRONLY- funkcja blokuje si¦ do momentu, a» inny proces nie otworzy kolejki FIFO do odczytu, O_RDONLY | O_NONBLOCK - funkcja powraca natychmiast, O_WRONLY | O_NONBLOCK - funkcja powraca natychmiast i przeka»e bª¡d je»eli nie ma procesu, który ma otwart¡ kolejk¦ FIFO do odczytu, W przeciwie«stwie do ª¡czy nienazwanych, pliki FIFO pozostaj¡ w systemie plików po zako«czeniu ich u»ywania przez wszystkie procesy. Dopiero jawne wywoªanie funkcji unlink() powoduje usuni¦cie ª¡cza nazwanego. unlink() int unlink(const char *pathname) • w przypadku powodzenia zwraca 0, a w przypadku bledu -1. • unlink() usuwa dowiazanie do pliku z katalogu oraz zmniejsza o jeden licznik dowi¡zan do tego pliku przechowywany w i-we¹le. Gdy licznik przyjmie wartosc zero, to zostanie usuniety równie» sam plik. Oznacza to udostepnienie zajmowanej przez niego przestrzeni dyskowej innym plikom (dodanie jej do listy wolnych bloków) oraz zwolnienie samego i-wezªa. Je»eli licznik dowiaza« osi¡gnie warto±¢ zero, podczas gdy dany plik jest nadal u»ywany (tzn. otwarty) przez inny proces, to usuni¦cie pliku b¦dzie wstrzymywane do czasu jego zamkni¦cia. 2 Zadania do samodzielnego wykonania 1. Napisa¢ program który tworzy trzy procesy - proces macierzysty i jego dwa procesy potomne. Pierwszy z procesów potomnych zapisuje do potoku dowolne zdanie, a drugi proces potomny odczytuje ten napis. 2. Napisa¢ program który tworzy trzy procesy, z których dwa zapisuj¡ do potoku, a trzeci odczytuje z niego i drukuje otrzymane komunikaty. 3. Napisa¢ programy realizuj¡ce nast¦puj¡ce potoki: • ls | wc, • nger | cut -d' ' -f1, | more. • ls -l | grep d • ps -ef| tr -s ' ' :| cut -d: -f1 |sort| uniq -c |sort n • cat /etc/group | head -5 > grupy.txt, • nd /usr/bin -type f -atime +100 -print > znalezione.txt, • ls -R / | sort | uniq | less, 4. Napisa¢ program tworz¡cy dwa procesy: klienta i serwera. Serwer tworzy ogólnodost¦pn¡ kolejk¦ FIFO, i czeka na zgªoszenia klientów. Ka»dy klient tworzy wªasn¡ kolejk¦, poprzez któr¡ b¦d¡ przychodzi¢ odpowiedzi serwera. Zadaniem klienta jest przesªanie nazwy stworzonej przez siebie kolejki, a serwera odesªaniem poprzez kolejk¦ stworzon¡ przez klienta wyniku polecenia ls. 4 5. Zmodykowa¢ poprzedni program, tak, by kolejka utworzona przez klienta byªa dwukierunkowa, klient publiczn¡ kolejk¡ powinien przesyªa¢ nazw¦ stworzonej przez siebie kolejki. Dalsza wymiana komunikatów powinna odbywa¢ si¦ poprzez kolejk¦ stworzon¡ przez klienta. Klient kolejk¡ t¡ powinien wysyªa¢ polecenia, zadaniem serwera jest wykonywanie tych polece« i odsyªanie wyników. 3 literatura • Havilland K., Gray D., Salama B., Unix - programowanie systemowe,1999 • Stevens R.W., Programowanie w rodowisku systemu UNIX, WNT, 2002. • Rochkind M.J., Programowanie w systemie UNIX dla zaawansowanych, WNT, 1997. 5