� 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