Instrukcja do laboratorium Systemów Operacyjnych
(semestr drugi)
w
Ć iczenie czwarte
Temat: Komunikacja IPC
Opracowanie:
mgr in .
ż Arkadiusz Chrobot
dr in .
ż Grzegorz u
Ł kawski
System Linux, podobnie jak inne systemy wywodz c
ą e się z Uniksa, udo-
st p
ę nia procesom u y
ż tkownika mechanizmy komunikacji, nazywane
w skrócie IPC (ang. Interprocess Communication). W skład tych mechanizmów wchodzą kolejki komunikatów. Choć możliwe jest, e ż ten mechanizm zostanie zmieniony lub cz
c
ęś iowo zastąpiony innym w przy-
sz y
ł ch specyfikacjach standardu, to obecnie stanowi on dogodny sposób komunikacji między procesami. W systemach uniksowych istnieją dwa polecenia dostępne z poziomu pow ok
ł
i u y
ż tkownika związane z obs u
ł gą
komunikacji IPC. Pierwsze z nich to ipcs (szczegó y ł : man ipcs), które
wy w
ś ietla informacje na temat utworzonych w systemie kolejek, semaforów i pamięci dzielonych. Drugie ipcrm (szczegó y ł : man ipcrm)
s u
ł
y
ż do „r c
ę znego” usuwania z systemu zasobów IPC. W systemie Linux istnieje również zbiorcza dokumentacja poświ c ę ona komunikacji
IPC, wy w
ś ietlana poleceniem man 5 ipc.
2. Kolejki komunikatów
Kolejki komunikatów są tworzone w przestrzeni j d
ą ra systemu. Proces
użytkownika ma do nich dost p
ę poprzez odpowiednie wywołania sys-
temowe (dokładniej, poprzez odpowiednie funkcje biblioteczne j z ę yka
C). Każda kolejka ma swój unikatowy identyfikator. Obs u ł ga kolejek
jest mniej skomplikowana niż łączy nazwanych. Ponadto sposób przesyłania informacji jest bardziej elastyczny. Jedna kolejka mo e ż s u
ł żyć
kilku procesom. Procesy mogą odbierać wszystkie komunikaty przecho-dzące przez kolejk ,
ę lub tylko wybrane. Komunikaty podlegają ograniczeniom zarówno pod względem wielkości jednego komunikatu, jak i sumarycznej wielkości wszystkich komunikatów. W systemie Linux pierwszy limit wynosi 4KB (stała MSGMAX), a drugi 16KB (stała MSGMNB).
3. Pliki nag ó
ł wkowe związane z obsługą kolejek
Ka d
ż y program obs u
ł gujący kolejkę musi mieć wł c
ą zone do swojego
kodu r
ź ódłowego nast p
ę ujące plik nag ów
ł
kowe: sys/types.h – definicje
typów, sys/ipc.h - funkcje i struktury wspólne dla wszystkich mechanizmów IPC, sys/msg.h – funkcje i struktury przeznaczone do obsługi kolejek komunikatów.
ż iejsze struktury zwi z
ą ane z kolejkami
Ka d
ż y komunikat opisany jest struktur ,
ą w której znajduje się obowiąz-
kowe pole okre l
ś ające typ komunikatu. Dalsza część definicji struktury komunikatu jest dowolna. Najcz
c
ęś iej podawana jest taka oto przykła-
dowa struktura komunikatu:
struct msgbuf {
long mtype;
char[1] mtext;
};
J d
ą ro systemu, dla ka d
ż ej kolejki utrzymuje strukturę msqid_ds, którą
mo n
ż a czę c
ś iowo modyfikować za pomocą funkcji msgctl(), g ów ł
nie do-
tyczy to pól struktury zagnie d
ż
on
ż
ej msg_perm: uid – identyfikatora
użytkownika dla wła c
ś iciela, guid – identyfikator grupy dla w a
ł
c
ś iciela
oraz pola mode, które obejmuje 9 najmłodszych bitów określających tryb dost p
ę u do kolejki.
Najwa n
ż iejsze funkcje obsługujące kolejki komunikatów
ftok() – funkcja zwraca unikatowy1 identyfikator, który mo n ż a u y
ż ć
do tworzenia kolejki komunikatu. Aby dwa niespokrewnione procesy mogły korzystać z tego samego kanału komunikacyjnego muszą podać te same argumenty dla wywo a
ł nia tej funkcji (tj. c
ś ie k
ż ę do-
st p
ę u do dowolnie wybranego pliku i naturalną liczbę ośmiobitową2. Szczegó y
ł : man ftok.
msgget() – funkcja tworz c
ą a kolejkę komunikatów i zwracająca jej
identyfikator lub zwraca identyfikator kolejki istniejącej. Kolejka jest tworzona na podstawie unikatowego klucza zwracanego przez funkcję ftok(), lub dobranego przez programistę. Jeśli kolejka ma być stworzona tylko i wył c
ą znie na użytek jednego procesu, to jako
klucz podaje się stałą IPC_PRIVATE. Drugi argument wywołania tej funkcji określa tryb dost p
ę u (czterocyfrowa liczba ósemkowa za-
czynająca się od zera, lub odpowiednia kombinacja sta y ł ch MSG_R
i MSG_W) oraz mo e
ż okre l
ś ać w jaki sposób ma być uzyskany iden-
tyfikator kolejki (IPC_CREAT i IPC_EXCL). Szczegóły: man msgget
1 Jest to za o
ł żenie idealne, ale w praktyce zdarzaj
ą się kolizje. Oznacza to, ze dla dwóch
ró n
ż ych par argumentów wywo a
ł nia funkcja ftok() mo e
ż zwrócić takie same wartości.
msgsnd() – funkcja umo l
ż iwia dodanie komunikatu do kolejki.
W zale n
ż o c
ś i od warto c
ś i ostatniego argumentu mo e,
ż w przypad-
ku kiedy kolejka jest zape n
ł iona, oczekiwać na zwolnienie miejsca
(IPC_WAIT) lub zwracać błąd (IPC_NOWAIT). Szczegóły: man msgsnd
msgrcv() – funkcja umo l
ż iwia odbiór komunikatu z kolejki. Mo l
ż i-
we jest selektywne odbieranie komunikatów, w zale n ż ości od warto c
ś i argumentu funkcji określaj c
ą ego typ odbieranego
komunikatu. Je l
ś i będzie on miał wartość zero, to b d
ę zie odebrany
pierwszy komunikat znajdujący się w kolejce. Je l
ś i wartość dodat-
nią, to odebrany będzie pierwszy komunikat o takim samym typie.
Je l
ś i natomiast argument b d
ę zie miał wartość ujemną, to odebra-
ny będzie komunikat o typie takim samym lub mniejszym co do wartości bezwzgl d
ę nej od podanego argumentu. Szczegó y
ł : man
msgrcv.
msgctl() – funkcja umo l
ż iwiaj c
ą a sterowanie kolejką istniej c
ą ą
kolejką komunikatów. Mo e
ż ona wykonać trzy operacje: IPC_STAT
– pobranie do struktury msqid_ds informacji o kolejce, IPC_SET –
ustawienie danych kolejki na podstawie zawarto c ś i struktury
msqid_ds i IPC_ RMID – usuni c
ę ie kolejki. Ostatnia operacja jest
mo l
ż iwa tylko wtedy, kiedy procesy korzystające z kolejki za-ko c
ń zy y
ł operacje pisania i czytania. Szczegóły: man msgctl.
Zadania
1. Napisz program, który utworzy prywatną kolejkę i b d ę zie przesy a
ł ł nią
komunikaty.
2. Zmodyfikuj zadanie pierwsze, tak aby proces tworzył potomka i komunikował si
ę z nim przy u y
ż ciu kolejki.
3. Napisz dwa programy (procesy niespokerwnione), które b d ę ą
komunikować się przy pomocy kolejki komunikatów. Do wygenerowania klucza u y
ż j funkcji ftok().
4. Zmodyfikuj programy z zadania trzeciego tak, aby zbadać jak się będzie zachowywała funkcja msgsnd(), w zale n
ż o c
ś i od tego, czy otrzyma flagę
IPC_NOWAIT, czy nie.
5. Napisz dwa programy: pierwszy wy l
ś e kilka komunikatów o losowo wy-
ż typy komunikatów należą do przedzia u
ł
[1,5]), a drugi będzie je odbierze w porz d
ą ku malejącym lub rosnącym,
ze wzgl d
ę u na wartoś
ć typu.
6. Napisz dwa programy: pierwszy wy l
ś e dziesięć komunikatów, a drugi
w zale n
ż ości od parametru wywo a
ł nia odbierze je w takiej samej lub od-
wrotnej kolejno c
ś i do tej z jaką wys a
ł ł je pierwszy program.
7. Napisz trzy programy, które komunikowałyby się przez wspólną kolejk .
ę Komunikacja musi być dwukierunkowa. Ka d
ż y program musi od-
bierać informacje przeznaczone tylko dla niego, ale mo e ż wysyłać informacje do obu pozostałych programów.
8. Za pomocą kolejki komunikatów programy mogą przesyłać wiadomości o ró n
ż ej d u
ł go c
ś i. Napisz dwa programy komunikujące się przez jedną kolejk ,
ę ale przesyłaj c
ą e mi d
ę zy sobą komunikaty o zmiennej d u
ł go c
ś i.
Za ó
ł ż,
e
ż
ka d
ż y „w a
ł
c
ś iwy” komunikat b d
ę zie poprzedzany
komunikatem o ustalonym formacie, który będzie informował o wielko c
ś i nast p
ę ującego po nim komunikatu.
9. Napisz trzy programy. Pierwszy niech zapisuje do kolejki liczby parzyste, drugi nieparzyste, a trzeci niech odczytuje kolejne pary liczb z kolejki i niech je sumuje.
Uwaga: We wszystkich programach tuż przed zako c ń zeniem ich działania wszystkie kolejki komunikatów z jakich one korzystają powinny zosta
ć usuni t
ę e.