ª¡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

Podobne dokumenty