© Wies P 24
law laczek
7 Kolejki komunikatów
7.1 Wprowadzenie
Kolejki komunikatów (ang. message queues) sał mechamizmem komunikacji miedzy
Å‚
procesami podobnym do potoków, jednak bardziej wyrafinowanym i dajacym wieksze
Å‚ Å‚
możliwości. Zosta one wprowadzone w Systemie V w ramach tzw. technik IPC (ang. in-
ly
terprocess communication), do których należał jeszcze semafory i pamieć dzielona. Podsta-
Å‚
wował jednostkał informacji używanał w mechanizmie kolejek komunikatów jest tzw. komu-
nikat, bedacy pewnał stuktura. Struktura ta, oprócz porcji danych, zawiera również identy-
Å‚ Å‚ Å‚
fikator, zwany typem komunikatu, s do identyfikowania przesy danych. Dzieki
lużacy lanych
Å‚ Å‚
temu w ramach kolejki komunikatów można tworzyć podkolejki, których wyróżnikiem jest
w typ komunikatu: dana podkolejka zawiera komunikaty określonego typu. Umożliwia
laśnie
to multipleksowanie zadań z różnych zróde Komunikaty umieszczane sał przez system w
l.
kolejce, do której dostep odbywa sie w trybie FIFO (element wpisany jako pierwszy jest
Å‚ Å‚
odczytany również jako pierwszy). Jeżeli kolejka sk sie z kilku podkolejek, to dostep
lada
Å‚ Å‚
FIFO dotyczy każdej podkolejki oddzielnie.
Z poziomu pow informacje o kolejkach komunikatów można uzyskiwać przy po-
loki
mocy komendy: ipcs -q(możliwe dalsze opcje, jak w przypadku semaforów i pamieci
Å‚
dzielonej), zaÅ› do usuwania kolejek s komenda:ipcrm -msg msqid, gdziemsqidjest
luży
systemowym identyfikatorem kolejki.
7.2 Tworzenie kolejek komunikatów
Do tworzenia kolejki komunikatów, jak również do odwo lywania sie do istniejacej już kolej-
Å‚ Å‚
ki przez proces, który chce z niej skorzystać, s funkcja systemowa msgget.
luży
Pliki w aczane
, ,
l
Å‚
Prototyp int msgget(keyt key, int msgflg);
Sukces Porażka Czy zmieniaerrno
Zwracana
wartość
Identyfikator kolejki -1 Tak
Zakończona sukcesem funkcja msgget tworzy kolejke komunikatów (lub uzyskuje dostep,
Å‚ Å‚
jeżeli taka już istnieje) dla danego klucza key (podobnie jak dla semaforów i pamieci dzielo-
Å‚
nej) i zwraca idendyfikator tej kolejki, bedacy pewnał liczbał ca nieujemna. Parametr
lkowiał
Å‚ Å‚ Å‚
msgflg określa sposób wykonania funkcji oraz prawa dostepu do kolejki komunikatów.
Å‚
" Flagi msgflg (najważniejsze):
IPCCREAT utworzenie kolejki komunikatów, jeśli nie istnieje lub uzyskanie dostepu
Å‚
do istniejacej już kolejki;
Å‚
IPCEXCL użyta w po aczeniu zIPCCREATzwraca b ad, jeżeli dla danego klucza
l l
Å‚ Å‚
istnieje już kolejka komunikatów;
Prawa dostepu podobnie jak dla plików, np. 0666: możliwość wykonywania operacji
Å‚
czytania i pisania przez wszystkie procesy.
Znaczniki oraz prawa dostepu można laczyć przy pomocy sumy bitowej, np.IPCCREAT|0666.
Å‚ Å‚
© Wies P 25
law laczek
7.3 Sterowanie kolejkami komunikatów
Do uzyskiwania informacji o kolejce komunikatów lub modyfikowania pewnych jej para-
metrów s funkcja systemowa msgctl.
luży
Pliki w aczane , ,
l
Å‚
Prototyp int msgctl(int msqid, int cmd,
/* struct msqidds *buf */...);
Sukces Porażka Czy zmieniaerrno
Zwracana
wartość
0 -1 Tak
Funkcja ta wykonuje operacje określone parametrem cmd na kolejce komunikatów o iden-
tyfikatorze msqid (zwracanym przez funkcje msgget).
Å‚
" Możliwe operacje cmd:
IPCSTAT usyskanie informacji o kolejce komunikatów przechowywanej w strukturze
msqiddszdefiniowanej w pliku nag ówkowym;
l
IPCSET modyfikowanie wybranych pól strukturymsqidds(użytkownik musi naj-
pierw utworzyć strukture typumsqidds, zmienić odpowiednie jej pola, a
Å‚
dopiero potem wywo funkcjemsgctlze znacznikiemIPCSEToraz adre-
lać
Å‚
sem tej struktury);
IPCRMID usuniecie danej kolejki komunikatów (trzeci argument może być tu po-
Å‚
miniety).
Å‚
7.4 Operacje na kolejkach komunikatów
Kolejki komunikatów umożliwiajał wysy i odbieranie niewielkich porcji danych. W pli-
lanie
ku nag ówkowymzdefiniowany jest szablon komunikatu jako nastepujaca
l
Å‚ Å‚
struktura:
struct msgbuf {
long mtype; /* typ komunikatu */
char mtext[1]; /* tekst komunikatu */
};
W rzeczywistości jest to jedynie sugestia jak definiować komunikat. Użytkownik bowiem
może zdefiniować w strukture komunikatu. Istotne jest jedynie to, by pierwsze pole
lasnał
Å‚
tej struktury zawiera typ komunikatu (liczba typulong), natomiast reszta może być
lo
dowolna. Wszystko bowiem co nastepuje po polu typulongjest traktowane przez system
Å‚
jako tekst komunikatu. Typ komunikatu (najcześciej liczba ca
lkowita dodatnia) umożliwia
Å‚
selektywne wybieranie komunikatów z kolejki. Komunikaty sał umieszczane w kolejce w ta-
kim porzadku w jakim sał wysy bez grupowania wed typów. Tak wiec koncepcja
lane, lug
Å‚ Å‚
podkolejek opisana we podrozdziale 7.1 jest jedynie pewnał logicznał abstrakcja, a nie fak-
Å‚
tycznał organizacjał kolejki w systemie. Niemniej jednak, w wielu zastosowaniach wygodnie
jest pos ly
lugiwać sie koncepcjał podkolejek bez wchodzenia w szczegó ich fizycznej orga-
Å‚
nizacji (to ostatnie jest raczej sprawał systemu operacyjnego niż użytkownika).
© Wies P 26
law laczek
Do wysy komunikatów do kolejki s funkcja systemowamsgsnd.
lania luży
Pliki w aczane , ,
l
Å‚
Prototyp int msgsnd(int msqid, const void *msgp,
sizet msgsz, int msgflg);
Sukces Porażka Czy zmieniaerrno
Zwracana
wartość
0 -1 Tak
Funkcja msgsnd wysy do kolejki o identyfikatorzemsqidkomunikat wskazywany przez
la
msgp o rozmiarze msgsz bajtów (maksymalny rozmiar komunikatu zależy od ustawień
systemowych). Parametr msgflg określa zachowanie funkcji w przypadku zape kolej-
lnienia
ki komunikatów (osiagniecia limitu systemowego d kolejki5). Może on przyjmować
lugości
Å‚ Å‚
nastepujace wartości:
Å‚ Å‚
0: operacja blokujaca,
Å‚
msgflg=
IPCNOWAIT: operacja nieblokujaca.
Å‚
Operacja blokujaca oznacza wstrzymanie procesu wysy lnionej
lajacego komunikat do zape
Å‚ Å‚
kolejki do momentu zwolnienia miejsca w kolejce. W przypadku operacji nieblokujacej
Å‚
proces nie zostanie wstrzymany, ale funkcja msgsnd zakończy sie porażkał (komunikat nie
Å‚
zostanie wys i ustawi zmiennałerrnona kodEAGAIN.
lany)
Komunikaty można pobierać z kolejki przy pomocy funkcji systemowejmsgrcv.
Pliki w aczane , ,
l
Å‚
Prototyp int msgrcv(int msqid, void *msgp, sizet msgsz,
long msgtyp, int msgflg);
Sukces Porażka Czy zmieniaerrno
Zwracana
wartość
Liczba odebranych bajtów -1 Tak
Funkcja msgrcv pobiera komunikat z kolejki o identyfikatorze msqid i umieszcza go w miej-
scu pamieci wskazywanym przez msgp (powinien to być wskaznik do struktury zgod-
Å‚
nej z formatem komunikatu) zwracajac liczbe faktycznie odebranych bajtów (w przy-
Å‚ Å‚
padku sukcesu). Argument msgsz określa maksymalny rozmiar komunikatu w bajtach
wartość ta powinna być równa najd
luższemu otrzymywanemu komunikatowi. Jeżeli
wartośc msgsz bedzie mniejsza od rozmiaru komunikatu, a argument msgflg bedzie usta-
Å‚ Å‚
wiony naMSGNOERROR, to dojdzie do obciecia komunikatu (obcieta cześć bedzie stracona),
Å‚ Å‚ Å‚ Å‚
w przeciwnym razie komunikat nie zostanie usuniety z kolejki, a fukcja msgrcv zakończy
Å‚
sie porażkał generujac kod b eduE2BIG. Poza tym argument msgflg określa czy pobieranie
l
Å‚ Å‚ Å‚
komunikatu ma być operacjał blokujacał (0), czy nieblokujacał (IPCNOWAIT) w przypadku
Å‚ Å‚
braku danego komunikatu w kolejce (niewykluczajace sie znaczniki można laczyć sumał
Å‚ Å‚ Å‚
bitowa). Typ komunikatu, który ma być pobrany z kolejki określa argument msgtyp.
Å‚
5
Limity systemowe dotyczace mechamizmów IPC można w niektórych wersjach Uniksa sprawdzić przy
Å‚
pomocy komendy:ipcs -l.
© Wies P 27
law laczek
" Możliwe wartości msgtyp i zwiazane z nimi czynności:
Å‚
= 0 pobierz pierwszy komunikat dowolnego typu;
> 0 pobierz pierwszy komunikat, którego typ bedzie równy wartości msgtyp;
Å‚
< 0 pobierz pierwszy komunikat, którego typ bedzie mniejszy lub równy wartości bez-
Å‚
wzglednej msgtyp.
Å‚
Sterujac odpowiednio wartościami argumentu msgtyp można latwo zaimplementować wymia-
Å‚
ne komunikatów z priorytetami.
Å‚
ĆWICZENIE 8: Klient Serwer: Kolejki Komunikatów
Proces klient wysy do procesu serwera ciag znaków. Serwer odbiera ten ciag zna-
la
Å‚ Å‚
ków i przetwarza go zamieniajac w nim wszystkie litery na wielkie, a natepnie wysy
la
Å‚ Å‚
tak przetworzony ciag znaków z powrotem do klienta. Klient odbiera przetworzony ciag
Å‚ Å‚
znaków i wypisuje go na ekranie.
Pos
lugujac sie mechanizmem kolejek komunikatów systemu UNIX, zaimplemen-
Å‚ Å‚
tować powyższe zadanie typu klient serwer, z możliwościał obs wielu klientów naraz.
lugi
W rozwiazaniu użyć tylko jednej kolejki komunikatów. Zastosować odpowiednie etykie-
Å‚
towanie komunikatów w celu rozróżniania w kolejce danych dla serwera oraz danych dla
poszczególnych klientów. Najlepiej z każdym komunikatem zwiazać dwa identyfikatory:
Å‚
jeden odpowiadajacy procesowi adresata, a drugi procesowi wysy
lajacemu (oczywiście,
Å‚ Å‚
jeden z nich powinien być umieszczony w obowiazkowym polu typu komunikatu).
Å‚
Spróbować uruchamiać każdy proces klienta z innego X-terminala (np. użyć komendy
xterm -e nazwaprogramu &w plikuMakefiledo uruchomienia serwera i kilku klientów;
wiecej informacji można znalezć wman xterm).
Å‚
Podobnie jak dla semaforów, stworzyć w biblioteke funkcji do obs kolejek.
lasnał lugi
Å‚
Wyszukiwarka
Podobne podstrony:
kolejkiFIFO(1)
kolejkaJA
KolejkKomunikatow6
SO2 instrukcja 4 Kolejki komunikatów
kolejki (2)
kolejka liniowa
KolejkaDoSerwera csproj FileListAbsolute
Kolejkowanie pasma w Linuxie
kolejki komunikatow
06 Stosy i kolejki
kolejka
zad kolejki1
stosy,kolejki,drzewa
stos kolejka i lista
kolejki podw
więcej podobnych podstron