Instrukcja do laboratorium Systemów Operacyjnych

(semestr drugi)

w

Ć iczenie czwarte

Temat: Komunikacja IPC

Opracowanie:

mgr in .

ż Arkadiusz Chrobot

dr in .

ż Grzegorz u

Ł kawski

1. Wprowadzenie

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.

4. Najwa n

ż 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-

branym typie (przyjmijmy, e

ż 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.