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
Paweł Niewiadomski
2000-10-17