next up previous contents
Next: WYWOŁANIE SYSTEMOWE: msgsnd() Up: Kolejki wiadomości Previous: Struktura ipc_perm w jądrze   Contents

WYWOŁANIE SYSTEMOWE: msgget()

W celu utworzenia nowej kolejki wiadomości lub dostępu do istniejącej używamy wywołania msgget().


     WYWOŁANIE SYSTEMOWE: msgget();                                                          
   
     PROTOTYP: int msgget ( key_t klucz, int msgflg );                                             
       ZWRACA: identyfikator kolejki - sukces                                                       
                -1 - błąd: errno = EACCESS ( brak prawa dostępu )
                                   EEXIST ( kolejka istnieje, nie można jej 
   					 utworzyć )
                                   EIDRM ( kolejka jest zaznaczona jako do usunięcia )
                                   ENOENT ( kolejka nie istnieje )
                                   ENOMEM ( brak pamięci aby utworzyć kolejkę )
                                   ENOSPC ( maxymalny limit kolejek przekroczony )
     UWAGI:
   

Pierwszym argumentem msgget() jest wartość klucza ( w naszym przypadku podana przez ftok()). Wartość ta porównywana jest do wartości kluczy kolejek istniejących wewnątrz jądra, w tym momencie otwarcie lub otworzenie kolejki zależy od zawartości argumentu msgflg:

IPC_CREAT

Utwórz kolejkę jeżeli ona nie istnieje.

IPC_EXCL

Użyte razem z IPC_CREAT zwraca błąd jeżeli kolejka istnieje.

Jeżeli używasz samo IPC_CREAT msgget() zwraca identyfikator nowo utworzonej kolejki lub istniejącej, której wartość klucza jest taka sama. Jeżeli używasz IPC_EXCL razem z IPC_CREAT zostanie utworzona nowa kolejka lub wywołanie zwróci błąd. Użycie tej flagi gwarantuje nam, że nie istenieje kolejka z otwartym dostępem.

Możesz również z'OR'ować dodatkowy ósemkowy tryb z argumentem, gdyż każdy obiekt IPC posiada prawa podobne w działaniu do praw pliku z systemu plików Unixa !!!

Utwórzmy prostą funkcję otwierającą lub tworzącą kolejkę wiadomości:


   int open_queue( key_t keyval )
   {
           int     qid;
           
           if((qid = msgget( keyval, IPC_CREAT | 0660 )) == -1)
           {
                   return(-1);
           }
           
           return(qid);
   }
   

Zauważ, iż używamy ograniczeń 0660. Ta mała funkcja zwraca identyfikator kolejki lub wartość -1. Jedynym argumentem jest wartość klucza.


next up previous contents
Next: WYWOŁANIE SYSTEMOWE: msgsnd() Up: Kolejki wiadomości Previous: Struktura ipc_perm w jądrze   Contents

2000-03-01


Poltronic