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.