J. Ułasiewicz Programowanie aplikacji współbieżnych 1
13. Kolejki komunikatów
13.1 Wstęp
Kolejka komunikatów Q posiada następujące własności:
- Posiada określoną pojemność N komunikatów (długość bufora
komunikatów).
- Posiada nazwę którą procesy mogą zidentyfikować.
- Więcej niż jeden proces może czytać lub pisać z/do kolejki.
PN1
PO1
n
PNk
Max
POn
Procesy nadające
Kolejka Q
Procesy odbierajace
Procesy komunikują się za pomocą kolejki Q
Przebieg operacji zapisu i odczytu zależy od liczby n komunikatów w kolejce i
od jej pojemności Max.
Liczba komunikatów n Wysłanie komunikatu Odbiór komunikatu
w kolejce Q Send(Q,buf,size) Receive(Q,buf,size)
n = Max Blokada lub Bez blokady
sygnalizacja błędu
0< n < Max Bez blokady Bez blokady
n = 0 Bez blokady Blokada lub sygnalizacja
błędu
Przebieg operacji na kolejce w zależności od liczby komunikatów n w jej
buforze
Kolejki komunikatów
PDF created with pdfFactory trial version www.pdffactory.com
J. Ułasiewicz Programowanie aplikacji współbieżnych 2
13.2 Kolejki komunikatów w IPC Unix System V
Tworzenie kolejki komunikatów
W IPC Unix System V kolejki komunikatów służą do komunikacji lokalnej.
Identyfikowane są przez klucz (podobnie jak w przypadku pamięci dzielonej i
semaforów).
int msgget(key_t key, int flags)
Key Klucz identyfikujący semafor
Flags Flagi specyfikują:
- tryb tworzenia kolejki (IP_CREAT, IPC_EXCL)
- prawa dostępu (9 mniej znaczących bitów)
Funkcja zwraca:
> 0 identyfikator kolejki
-1 błąd
Przykład:
d = msgget(ftok(name, 1), IPC_CREAT | 0660);
Wysyłanie komunikatów
Komunikaty wysyła się przy pomocy funkcji msgsnd zdefiniowanej jak poniżej.
int msgsnd(int msgid, msgbuf* msg, size_t size, int
flags)
msgid
Identyfikator kolejki (zwracany przez funkcję msgget)
msg
Adres bufora z wysyłanym komunikatem
size
Długość wysyłanego komunikatu
flags
Dopuszczalna tylko flaga IPC_NOWAIT
Funkcja zwraca:
0 - sukces
-1 - błąd
Komunikat powinien być strukturą zdefiniowaną poniżej:
typedef struc {
int typ; // Typ komunikatu
char tekst[SIZE]; // Treść komunikatu
} msgbuf
- Pole typ używane jest w funkcji odbierającej do selekcji komunikatu.
- Pole tekst może być dowolną strukturą dowolnego rozmiaru.
Kolejki komunikatów
PDF created with pdfFactory trial version www.pdffactory.com
J. Ułasiewicz Programowanie aplikacji współbieżnych 3
Maksymalna liczba bajtów która może być przechowywana w kolejce
zdefiniowana jest w polu msg_bytes struktury msg_stat stowarzyszonej z
kolejką i może być zmodyfikowana przy pomocy funkcji msgctl.
Działanie funkcji msgsnd:
1. Gdy jest miejsce w kolejce komunikat msg jest dołączany do tej kolejki.
2. Gdy brak miejsca w kolejce proces bieżący blokowany jest do czasu gdy
miejsce takie się pojawi. Gdy ustawiona jest flaga IPC_NOWAIT proces
nie jest blokowany a wywołanie kończy się błędem.
Przy wysyłaniu sprawdzane są prawa dostępu do kolejki komunikatów. Gdy
proces nie ma stosownych praw do użycia kolejki wywołanie kończy się
błędem.
Przykład: Zapis komunikatu typu 1 do kolejki 333
struct {
int typ;
char tekst[128];
} msg;
d = msgget(333, IPC_CREAT | 0660);
msg.typ = 1;
strcpy(msg.tekst, test );
res = msgsnd(d,&msg,sizeof(msg),0);
Odbiór komunikatów
Komunikaty odbiera się przy pomocy funkcji msgrcv zdefiniowanej jak poniżej.
int msgrcv(int msgid, msgbuf* msg, size_t size, long
mtyp, int flags)
msgid Identyfikator kolejki (zwracany przez funkcję msgget)
msg Adres bufora na odbierany komunikat
size Maksymalna długość odbieranego komunikatu
mtyp Typ komunikatu
flags Dopuszczalne są flagi IPC_NOWAIT, MSG_NOERROR
Funkcja zwraca:
> 0 - liczba odebranych bajtów
- 1 - błąd
Działanie funkcji msgrcv zależy od:
1. Parametru mtyp od parametru tego zależy które komunikaty z kolejki
będą odebrane.
2. Stanu kolejki i flag czynniki te decydują o synchronizacji procesów.
Kolejki komunikatów
PDF created with pdfFactory trial version www.pdffactory.com
J. Ułasiewicz Programowanie aplikacji współbieżnych 4
Zależność od parametru mtyp:
1. Gdy mtyp > 0 z kolejki odbierane są komunikaty danego typu (typ = mtyp).
2. Gdy mtyp = 0 to odbierane są wszystkie komunikaty
3. Gdy mtyp < 0 odbierane są komunikaty których typ jest mniejszy od
wartości bezwzględnej parametru mtyp. Komunikaty odbierane są w
kolejności od najmniejszego pola typ do największego.
Zależność od stanu kolejki:
1. Gdy w kolejce jest komunikat żądanego typu proces bieżący kopiuje ten
komunikat do bufora msg, usuwa go z kolejki i biegnie dalej.
2. Gdy w kolejce brak komunikatu żądanego typu proces bieżący ulega
zablokowaniu do czasu gdy taki proces się pojawi. Gdy ustawiona jest
flaga IPC_NOWAIT proces nie jest blokowany a wywołanie kończy się
błędem.
Gdy w kolejce znajduje się komunikat którego długość przekracza parametr
size to działanie zależy od flagi MSG_NOERROR. Gdy flaga będzie
ustawiona komunikat zostanie obcięty. Gdy flaga nie jest ustawiona
wywołanie skończy się błędem.
Przykład: Odbiór komunikatu typu 1 z kolejki 333
struct {
int typ;
char tekst[128];
} msg;
&
d = msgget(333, IPC_CREAT | 0660);
res = msgrcv(d,&msg, sizeof(msg),1,0);
Kolejki komunikatów
PDF created with pdfFactory trial version www.pdffactory.com
J. Ułasiewicz Programowanie aplikacji współbieżnych 5
Testowanie i ustawianie parametrów kolejki
Do testowania i ustawiania parametrów kolejki służy funkcja msgctl.
Najważniejsze polecenia to testowanie statusu kolejki, ustawianie jej
parametrów oraz usunięcie całej kolejki z systemu.
int msgctl(int msgid, int command, struct msqid_ds *stat)
msgid Identyfikator kolejki (zwracany przez funkcję msgget)
command Polecenie
stat Bufor na dane lub polecenia
Funkcja zwraca:
> 0 - sukces
- 1 - błąd
Testowanie statusu kolejki polecenie IPC_STAT
Gdy pole command przyjmuje wartość IPC_STAT do struktury stat system
kopiuje informacje o stanie kolejki. Niektóre pola struktury stat podane są
poniżej:
struct msqid_ds {
...
unsigned long int msg_cbytes;
Aktualna liczba bajtów w kolejce
msgqnum_t msg_qnum;
Aktualna liczba komunikatów w
kolejce
msglen_t msg_qbytes;
Maksymalna liczba bajtów w kolejce
pid_t msg_lspid;
pid procesu wykonującego msgsnd
pid_t msg_lrpid;
pid procesu wykonującego msgrcv
}
Ustawianie parametrów kolejki polecenie IPC_SET
Aby ustawić parametry kolejki komunikatów używa się polecenia IPC_SET.
Zmieniać można:
" prawa dostępu (można je też ustawić przy tworzeniu)
" maksymalną długość kolejki.
Następuje to poprzez ustawienia pola msg_qbytes struktury stat. Domyślnie
wartość tego pola wynosi 16 KB.
Przykład:
struct msqid_ds buf;
d = msgget(ftok(argv[1], 1), IPC_CREAT | 0666);
buf.msg_qbytes = 128;
msgctl(d,IPC_SET,&buf);
Kasowanie kolejki komunikatów
Aby skasować kolejkę komunikatów używa się polecenia IPC_RMID.
Polecenie to może być wykonane przez administratora i właściciela kolejki.
Kolejki komunikatów
PDF created with pdfFactory trial version www.pdffactory.com
J. Ułasiewicz Programowanie aplikacji współbieżnych 6
Przykład:
d = msgget(ftok(argv[1], 1), IPC_CREAT | 0666);
msgctl(d,IPC_RMID,NULL);
// Kolejki komunikatow IPC Unix System V
// Testowanie statusu kolejki
#include
#include
#include
#define TSIZE 64
struct {
int typ;
char tekst[TSIZE];
} msg;
main(int argc, char *argv[])
{
int d, i, res;
struct msqid_ds buf;
d = msgget(ftok(argv[1], 1), IPC_CREAT | 0666);
msgctl(d,IPC_STAT,&buf);
printf("Maks. dlug. kolejki: %d \n",buf.msg_qbytes);
buf.msg_qbytes = 128;
msgctl(d,IPC_SET,&buf);
do {
msgctl(d,IPC_STAT,&buf);
printf("Maks. dlug. kolejki: d\n",buf.msg_qbytes);
printf("Akt. dlug. kolejki: d\n",buf.msg_cbytes);
printf("Komunikatow: %d\n",buf.msg_qnum);
sleep(1);
} while(1);
}
Przykład 13-1 Testowanie statusu kolejki komunikatów
Kolejki komunikatów
PDF created with pdfFactory trial version www.pdffactory.com
J. Ułasiewicz Programowanie aplikacji współbieżnych 7
// Kolejki komunikatow IPC Unix System V
// Problem producenta / konsumenta
#include
#include
#include
#define TSIZE 128
#define QSIZE 2
struct {
int typ;
char tekst[TSIZE];
} msg;
main(int argc, char *argv[])
{
int d, i, res;
struct msqid_ds buf;
if(argc < 2) {
printf("Uzycie msg3 [P|K|R]\n");
exit(0);
}
d = msgget(ftok(argv[0], 1), IPC_CREAT | 0666);
if(d < 0) { perror("Open"); exit(0); }
msgctl(d,IPC_STAT,&buf);
buf.msg_qbytes = sizeof(msg)*QSIZE;
msgctl(d,IPC_SET,&buf);
if(argv[1][0] == 'P') { // Producent
msg.typ =1;
for (i=0;i<10;i++) {
sprintf(msg.tekst,"Komunikat %d ",i);
res = msgsnd(d,&msg,sizeof(msg),0);
if(res < 0) { perror("Send"); exit(0); }
printf("Producent: %s\n",msg.tekst);
sleep(1);
}
}
if(argv[1][0] == 'K') { // Konsument
for (i=0;i<10;i++) {
printf("Konsument: %s\n",msg.tekst);
res = msgrcv(d,&msg,sizeof(msg),0,0);
if(res < 0) perror("Rcv");
}
}
if(argv[1][0] == 'R') msgctl(d,IPC_RMID,NULL);
}
Przykład 13-2 Wykorzystanie kolejki komunikatów problem producenta /
konsumenta
Kolejki komunikatów
PDF created with pdfFactory trial version www.pdffactory.com
J. Ułasiewicz Programowanie aplikacji współbieżnych 8
$ ./msg1 P
Producent: Komunikat 0
Producent: Komunikat 1
Producent: Komunikat 2
....
Producent: Komunikat 9
$
$ ./msg1 K
Konsument: Komunikat 0
Konsument: Komunikat 1
Konsument: Komunikat 2
....
Konsument: Komunikat 8
$
Kolejki komunikatów
PDF created with pdfFactory trial version www.pdffactory.com
J. Ułasiewicz Programowanie aplikacji współbieżnych 9
13.3 Kolejki komunikatów - POSIX
13.4 Podstawowe własności
Procesy piszace
Proces czytajacy
/dev/mqueue/kolejka1
P1
P3
P2
Kolejka komunikatow
Dwa procesy piszą do jednej kolejki
Podstawowe cechy kolejek komunikatów:
1. W przypadku komunikatów komunikacja zachodzi bezpośrednio pomiędzy
procesami. Kolejki komunikatów są pośrednim obiektem komunikacyjnym
widzianym jako plik specjalny. Komunikujące się procesy nie muszą znać
swoich identyfikatorów.
2. Komunikaty odczytywane z kolejki zachowują strukturę są separowane.
W kolejce mogą znajdować się komunikaty różnej długości. Własności tej
nie mają kolejki FIFO.
3. Można zadać maksymalną długość kolejki komunikatów. Gdy zostanie ona
przekroczona, proces piszący do kolejki komunikatów będzie
zablokowany.
4. Kolejka widziana jest w systemie plików jako plik specjalny. Operacje
zapisu / odczytu mogą być zabezpieczane prawami dostępu tak jak w
przypadku plików regularnych.
5. Można testować status kolejki (np. liczbę komunikatów w kolejce). Nie jest
to możliwe w przypadku kolejek FIFO.
6. Komunikatom można nadać priorytet. Komunikaty wyższym priorytecie
będą umieszczane na początku kolejki.
Zastosowanie kolejki komunikatów jest wygodnym rozwiązaniem w
następujących przypadkach:
1. Proces wysyłający komunikaty nie może być wstrzymany.
2. Proces wysyłający komunikaty nie potrzebuje szybkiej informacji zwrotnej
o tym czy komunikat dotarł do adresata.
3. Zachodzi potrzeba przekazywania danych z procesu w którym one
powstają (producent) do procesu w którym są one przetwarzane
(konsument)
Kolejki komunikatów
PDF created with pdfFactory trial version www.pdffactory.com
J. Ułasiewicz Programowanie aplikacji współbieżnych 10
13.5 Podstawowe typy i plik nagłówkowy
Kolejka komunikatów jest typu mqd_t. Typ ten jest zdefiniowany w pliku
nagłówkowym . Modyfikowalne atrybuty kolejki komunikatów
zdefiniowane są w strukturze mq_attr.
struct mq_attr {
long mq_maxmsg; // Maksymalna liczba komunikatów w kolejce
long mq_msgsize; // Maksymalna wielkość pojedynczego komunikatu
long mq_curmsg; // Aktualna liczba komunikatów w kolejce
long mq_flags; // Flagi
long mq_sendwait; // Liczba procesów zablok. na operacji zapisu
long mq_recvwait; // Liczba procesów zablok. na operacji odczytu
}
13.6 Utworzenie i otwarcie kolejki komunikatów
Kolejkę komunikatów tworzy się za pomocą funkcji:
mqd_t mq_open(char *name,int oflag,int mode,mq_attr
*attr)
name
Aańcuch identyfikujący kolejkę komunikatów. Kolejki tworzone
są w katalogu /dev/mqueue
oflag
Tryb tworzenia kolejki. Tryby te są analogiczne jak w zwykłej
funkcji open.
mode
Prawa dostępu do kolejki (r - odczyt, w - zapis) dla właściciela
pliku, grupy i innych, analogicznie jak w przypadku plików
regularnych. Atrybut x - wykonanie jest ignorowany.
attr
Atrybuty kolejki
Ważniejsze tryby tworzenia kolejki komunikatów:
Kolejki komunikatów
PDF created with pdfFactory trial version www.pdffactory.com
J. Ułasiewicz Programowanie aplikacji współbieżnych 11
Tryb Znaczenie
O_RDONLY
Tylko odczyt z kolejki
O_WRONLY
Tylko zapis do kolejki
O_RDWR
Odczyt i zapis
O_CREAT
Utwórz kolejkę o ile nie istnieje
O_NONBLOCK
Domyślnie flaga jest wyzerowana co
powoduje że operacje odczytu
(mq_receive) i zapisu (mq_send) mogą
być blokujące. Gdy flaga jest ustawiona
operacje te nie są blokujące i kończą się
błędem.
Podstawowe flagi używane przy tworzeniu kolejek komunikatów
Domyślne atrybuty:
Atrybut Wartość domyślna
Mq_maxmsg 1024
Mq_msgsize 4096
Mq_flags 0
Gdy kolejka już istnieje parametry 3 i 4 funkcji mq_open są ignorowane.
Funkcja mq_open zwraca:
1. W przypadku pomyślnego wykonania wynik jest nieujemny jest to
identyfikator kolejki komunikatów
2. W przypadku błędu funkcja zwraca 1.
13.7 Wysłanie komunikatu do kolejki
Wysłanie komunikatu do kolejki komunikatów odbywa się za pomocą funkcji:
int mq_send(mqd_t mq, char *msg, size_t len, unsigned int
mprio)
Znaczenie parametrów:
mq
identyfikator kolejki komunikatów,
*msg
adres bufora wysyłanego komunikatu,
len
długość wysyłanego komunikatu,
mprio
priorytet komunikatu (od 0 do MQ_PRIORITY_MAX).
Wywołanie funkcji powoduje przekazanie komunikatu z bufora msg do kolejki
mq. Można wyróżnić dwa zasadnicze przypadki:
1) W kolejce jest miejsce na komunikaty. Wtedy wykonanie funkcji nie
spowoduje zablokowania procesu bieżącego.
Kolejki komunikatów
PDF created with pdfFactory trial version www.pdffactory.com
J. Ułasiewicz Programowanie aplikacji współbieżnych 12
2) W kolejce brak miejsca na komunikaty. Wtedy wykonanie funkcji
spowoduje zablokowania procesu bieżącego. Proces ulegnie
odblokowaniu gdy zwolni się miejsce w kolejce.
Zachowanie się funkcji uzależnione jest od stanu flagi O_NONBLOCK. Flaga
ta jest domyślnie wyzerowana. W ogólności funkcja zwraca:
0 Sukces
-1 Błąd
13.8 Pobieranie komunikatu z kolejki
Pobieranie komunikatu z kolejki komunikatów odbywa się za pomocą funkcji
mq_receive.
int mq_receive(mqd_t mq, char *msg, size_t len, unsigned
int *mprio)
Znaczenie parametrów:
mq
identyfikator kolejki komunikatów,
*msg
adres bufora na odbierany komunikat,
len
maksymalna długość odbieranego komunikatu,
mprio
priorytet odebranego komunikatu.
1. Gdy w kolejce znajduje się przynajmniej jeden komunikat wywołanie
funkcji mq_receive nie spowoduje zablokowania procesu bieżącego.
2. Gdy w kolejce brak komunikatów wywołanie funkcji mq_receive
spowoduje zablokowania procesu bieżącego. Proces ulegnie
odblokowaniu gdy w kolejce pojawi się jakiś komunikat.
Proces 2 Proces 1 Stan kolejki
mq_receive(...
)
Pusta
kolejka komunikatów
Blokada
mq_send(...)
Pusta
Proces 2 blokuje się przy próbie odbioru komunikatu z kolejki.
W przypadku gdy więcej niż jeden proces czeka na komunikat odblokowany
będzie proces który najdłużej czekał. Zachowanie się funkcji uzależnione jest
także od stanu flagi O_NONBLOCK. Funkcja mq_receive zwraca:
>0 Rozmiar odebranego komunikatu gdy wynik jest większy od 0.
1 Gdy wystąpił błąd.
Kolejki komunikatów
PDF created with pdfFactory trial version www.pdffactory.com
J. Ułasiewicz Programowanie aplikacji współbieżnych 13
Przykład:
Procesy P1 i P2 komunikują się przy pomocy kolejki komunikatów problem
producenta konsumenta.
// Proces P1 wysylajacy komunikaty do kolejki MQ1 -------
#include
#include
#define SIZE 80
typedef struct {
int type; // Typ komunikatu
char text[SIZE]; // Tekst komunikatu
} msg_tp;
main(int argc, char *argv[]) {
int i;
int res;
mqd_t mq;
msg_tp msg;
struct mq_attr attr;
// Ustalenie atrybutów kolejki ----------------
attr.mq_msgsize = sizeof(msg);
attr.mq_maxmsg = 8;
// Utworzenie kolejki komunikatow ------------
mq=mq_open( MQ1 ,O_RDWR | O_CREAT, 0666,&attr);
if(mq < 0) { // Błąd
perror( Kolejka MQ1 );
exit(-1);
}
for(i=0; i < 10 ;i++) {
sprintf(msg.text,"Proces 1 komunikat %d",i);
// Wysłanie komunikatu ----------------
res = mq_send(mq,&msg,sizeof(msg),10);
sleep(1);
}
mq_close(mq);
}
Kod procesu wysyłającego komunikaty do kolejki MQ1 - producent
Kolejki komunikatów
PDF created with pdfFactory trial version www.pdffactory.com
J. Ułasiewicz Programowanie aplikacji współbieżnych 14
// Proces P2 odbierający komunikaty z kolejki MQ1 -------
#include
#include
#define SIZE 80
typedef struct {
int type; // Typ komunikatu
char text[SIZE]; // Tekst komunikatu
} msg_tp;
main(int argc, char *argv[]) {
int i;
int res;
mqd_t mq;
msg_tp msg;
struct mq_attr attr;
// Ustalenie atrybutów kolejki ----------------
attr.mq_msgsize = sizeof(msg);
attr.mq_maxmsg = 8;
// Utworzenie kolejki komunikatow ------------
mq=mq_open( MQ1 ,O_RDWR | O_CREAT, 0666,&attr);
if(mq < 0) { // Błąd
perror( Kolejka MQ1 );
exit(-1);
}
for(i=0; i < 10 ;i++) {
sprintf(msg.text,"Proces 1 komunikat %d",i);
// Odbiór komunikatu ----------------
res = mq_receive(mq,&msg,sizeof(msg),10);
printf( %s\n ,msg.text);
}
mq_close(mq);
}
Kod procesu odbierającego komunikaty z kolejki MQ1 - konsument
Kolejki komunikatów
PDF created with pdfFactory trial version www.pdffactory.com
J. Ułasiewicz Programowanie aplikacji współbieżnych 15
13.9 Testowanie statusu kolejki komunikatów
Testowanie statusu kolejki komunikatów odbywa się poprzez wykonanie
funkcji:
int mq_getattr(mqd_t mq, struct mq_attr *attr)
Znaczenie parametrów:
mq
Iidentyfikator kolejki komunikatów,
*attr
Adres bufora ze strukturą zawierającą atrybuty kolejki
komunikatów
Użyteczne elementy struktury atrybutów:
mq_curmsg
Aktualna liczba komunikatów w kolejce
mq_sendwait
Liczba procesów zablokowanych na operacji zapisu
mq_recvwait
Liczba procesów zablokowanych na operacji odczytu
13.10 Zawiadamianie procesu o pojawieniu się komunikatu w kolejce
1. Można spowodować aby pojawienie się komunikatu w pustej kolejce (a
wiec zmiana stanu kolejki z pusta na niepusta ) powodowało
zawiadomienie procesu bieżącego.
2. Zawiadomienie może mieć postać sygnału lub depozytu (ang. Proxy).
int mq_notify(mqd_t mq, struct sigevent *notif)
Znaczenie parametrów:
mq
Identyfikator kolejki komunikatów,
*notif
Adres struktury typu sigevent specyfikującego sposób
zawiadomienia.
1) Gdy pole sigev_signo > 0 interpretowane jest ono jako numer sygnału
który będzie wysłany gdy w kolejce pojawi się komunikat. W procesie
należy zdefiniować sposób obsługi tego sygnału.
2) Gdy pole sigev_signo < 0 jego wartość bezwzględna interpretowana
jest jako numer depozytu generowanego gdy w kolejce pojawi się
komunikat.
13.11 Zamknięcie i skasowanie kolejki komunikatów
Gdy proces przestanie korzystać z kolejki komunikatów powinien ją zamknąć.
Do tego celu służy funkcja:
int mq_close(mqd_t mq)
Kolejkę kasuje się za pomocą polecenia:
int mq_unlink(char *name)
Kolejki komunikatów
PDF created with pdfFactory trial version www.pdffactory.com
J. Ułasiewicz Programowanie aplikacji współbieżnych 16
Przykład - Proces P1 odbiera komunikaty z dwóch zródeł
Kolejka komunikatów
MQ1
P2 P1 P3
Proces wysylający
Proces odbierający
Proces piszacy do
komunikaty do P1
komunikaty z kolejki
kolejki komunikatow
MQ1 i od procesu P3
MQ1
Proces P1 odbiera komunikaty z dwóch zródeł kolejki MQ1 i procesu P3
// Proces P1 - odbiór komunikatów z dwóch zródeł --------
// 1. Kolejki komunikatów MQ1
// 2. Innych procesów
// Wykorzystano zawiadomienie o zmianie stanu kolejki za
// pomocą depozytu.
main( void) {
struct sigevent notify;
mqd_t mq;
pid_t proxy;
// Utworzenie kolejki komunikatów --------
mq = mq_open( MQ1 ,O_RDWR);
// Utworzenie depozytu proxy -----------
proxy = qnx_proxy_attach(0,0,0,0);
notify. sigev_signo = -proxy;
// Ustanowienie sposobu zawiadomienia ----
mq_notify(mq,& notify);
do {
// Odbiór komunikatu lub depozytu -------------
res = Receive(0,&msg,sizeof(msg));
if(res == proxy) { // Komunikat w kolejce
// Odbiór komunikatu z kolejki
mq_receive(mq,&msg,sizeof(msg),&prior);
......
} else { // Komunikat od innego procesu-------
........
Reply(res,.....);
}
} while(...);
}
Odbiór komunikatów z dwóch zródeł kolejki komunikatów i procesów.
Kolejki komunikatów
PDF created with pdfFactory trial version www.pdffactory.com
J. Ułasiewicz Programowanie aplikacji współbieżnych 17
13.12 Przykład zastosowanie kolejki komunikatów w systemie akwizycji
danych.
T1
PO1
T2
PO2
Urządzenie
Aącze PW
pomiarowe
Proces pobierający i
TN
PON
wysyłający dane
Procesy odbierające
dane
Proces akwizycji danych PW przesyła wyniki do N procesów PO
odbierających dane za pomocą komunikatów
T1
PO1
T2
PO2
Urządzenie
PA PD
pomiarowe
TN
Dystrybutor
Kolejka komunikatów
komunikatów
Proces Q
PON
akwizycji
danych Procesy odbierające
dane
Akwizycja i dystrybucja danych odbywa się poprzez dwa procesy PA i PD
połączone kolejką komunikatów Q.
Kolejki komunikatów
PDF created with pdfFactory trial version www.pdffactory.com
Wyszukiwarka
Podobne podstrony:
kolejkiFIFO(1)
KolejkiKomunikatow
kolejkaJA
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