sys/msg.h

Transkrypt

sys/msg.h
Ćwiczenie 5
Do wywołania funkcji niezbędne są następujące pliki nagłówkowe:
<sys/msg.h>
<sys/types.h>
<sys/ipc.h>
1.
Do tworzenia lub odwoływania się do dzielonego segmentu pamięci potrzebny jest tzw. klucz – liczba
całkowita. Sposób tworzenia podobnie jak w przypadku semaforów (funkcja key_t ftok(const char
*path, int id)).
2.
Tworzenie kolejki komunikatów oraz odwołanie do istniejącej kolejki: msgget.
Pliki nagłówkowe
Prototyp
Zwracana wartość
<sys/msg.h>, <sys/types.h>, <sys/ipc.h>
int msgget(key_t key, int msgflg);
sukces
poraŜka
Identyfikator kolejki
-1
key – klucz do kolejki (róŜne procesy, które chcą skorzystać z tego samego segmentu, muszą uŜyć tego
samego klucza), ftok lub IPC_PRIVATE.
msgflg – flaga określająca sposób wykonania funkcji i prawa dostępu do kolejki:
IPC_CREAT – utworzenie kolejki lub uzyskanie dostępu do istniejącej kolejki
IPC_EXCL – uŜyta łącznie z IPC_CREAT zwraca błąd, jeŜeli dla danego klucza istnieje juŜ kolejka
PRAWA DOSTĘPU – podobnie jak do pliku np. 0777
3.
Struktura komunikatu.
Jest ograniczona na dwa sposoby. Komunikat musi być mniejszy od systemowego limitu oraz musi
rozpoczynać się od wartości typu long int, uŜywanej jako wskaźnik typu komunikatu w funkcji
odbiorczej. Przykładowa postać struktury komunikatu:
struc moj_komunikat {
long int typ_komunikatu;
/* przekazane dane*/
}
4.
Dodanie komunikatu do kolejki: msgsnd
Pliki nagłówkowe
Prototyp
Zwracana wartość
msqid
*msg_ptr
msg_sz
msgflg
5.
<sys/msg.h>, <sys/types.h>, <sys/ipc.h>
int msgsnd( int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);
Sukces
poraŜka
0
-1
– identyfikator kolejki (zwracany przez msgget);
– wskaźnik do wysłanego komunikatu;
– rozmiar komunikatu na który wskazuje msg_ptr bez wartości long int;
– flaga określająca reakcję na przepełnienie kolejki:
IPC_NOWAIT – funkcja powróci bez wysłania komunikatu zwracając -1;
IPC_WAIT – proces zostanie zawieszony w oczekiwaniu na zwolnienie miejsca w
kolejce.
Pobranie komunikatu z kolejki: msgrcv.
Pliki nagłówkowe
Prototyp
Zwracana wartość
msqid
*msg_ptr
msg_sz
msgtype
<sys/msg.h>, <sys/types.h>, <sys/ipc.h>
int msgrcv( int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int
msgflg);
Sukces
poraŜka
Liczba pobranych bajtów
-1
– identyfikator kolejki (zwracany przez msgget);
– wskaźnik do odebranego komunikatu;
– rozmiar komunikatu na który wskazuje msg_ptr bez wartości long int;
=0 pobierany pierwszy dostępny komunikat;
>0 (np.11) pobierany pierwszy dostępny komunikat danego typu;
>0 (np.-6) pobierany pierwszy dostępny komunikat, którego typ ma wartość taką
samą lub mniejszą niŜ absolutna wartość msgtype;
6.
Obsługa kolejek komunikatów: msgctl.
Pliki nagłówkowe
Prototyp
Zwracana wartość
<sys/msg.h>, <sys/types.h>, <sys/ipc.h>
int msgctl(int msqid, int cmd, struct msqid_ds *buf );
Sukces
PoraŜka
0
-1
msqid
– identyfikator kolejki (zwracany przez msgget);
cmd – operacje na kolejce:
IPC_RMID – usuwa kolejkę
IPC_SET – ustawia wartości związane z kolejką komunikatów na dane określone w strukturze
msgid_ds (jeŜeli proces ma odpowiednie zezwolenia);
IPC_STAT – ustawia dane w strukturze msgid_ds tak, aby otrzymały wartości związane z kolejką
komunikatów.