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:
Utwórz kolejkę jeżeli ona nie istnieje.
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.