msgget(2) System Calls Manual msgget(2) NAZWA msgget - pobiera identyfikator kolejki komunikatow Systemu V BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include int msgget(key_t key, int msgflg); OPIS Wywolanie systemowe msgget() zwraca identyfikator kolejki komunikatow Systemu V skojarzony z wartoscia argumentu key. Moze posluzyc do uzyskania identyfikatora poprzednio utworzonej kolejki komunikatow (gdy msgflg wynosi zero, a key nie ma wartosci IPC_PRIVATE) lub do utworzenia nowego zestawu. Tworzy nowa kolejke komunikatow, gdy key ma wartosc IPC_PRIVATE lub gdy key jest rozny od IPC_PRIVATE i nie istnieje kolejka o kluczu podanym w key, a w parametrze msgflg ustawiono IPC_CREAT. Jesli w parametrze msgflg podano zarowno IPC_CREAT, jak i IPC_EXCL oraz juz istnieje kolejka komunikatow o kluczu key, to msgget() konczy sie bledem, ustawiajac errno na wartosc EEXIST. (Dziala to analogicznie do O_CREAT | O_EXCL w open(2)). Podczas tworzenia kolejki najmniej znaczace bity argumentu msgflg definiuja prawa dostepu do niej. Prawa te maja taka sama postac i znaczenie (semantyke) jak prawa dostepu podawane w parametrze mode wywolania open(2) (Prawa do uruchamiania nie sa uzywane). Jesli tworzona jest nowa kolejka komunikatow, wywolanie to w nastepujacy sposob inicjuje strukture danych msqid_ds (patrz msgctl(2)): o msg_perm.cuid i msg_perm.uid przyjmuja wartosc efektywnego identyfikatora wlasciciela procesu wywolujacego. o msg_perm.cgid i msg_perm.gid przyjmuja wartosc efektywnego identyfikatora grupy procesu wywolujacego. o 9 najmniej znaczacych bitow pola msg_perm.mode jest kopiowanych z 9 najmniej znaczacych bitow msgflg. o msg_qnum, msg_lspid, msg_lrpid, msg_stime i msg_rtime przyjmuja wartosc 0. o msg_ctime jest ustawiane na biezacy czas. o msg_qbytes przyjmuje wartosc rowna ograniczeniu systemowemu MSGMNB. Jesli kolejka juz istnieje, to sa weryfikowane uprawnienia i jest sprawdzane, czy kolejka nie jest przeznaczona do usuniecia. WARTOSC ZWRACANA W przypadku powodzenia, msgget() zwraca identyfikator kolejki komunikatow (liczbe nieujemna). W razie wystapienia bledu zwracane jest -1 i ustawiane errno wskazujac blad. BLEDY EACCES Kolejka komunikatow skojarzona z key istnieje, jednakze proces wywolujacy funkcje nie ma ani wystarczajacych praw dostepu do tej kolejki, ani nie ma ustawionego przywileju CAP_IPC_OWNER (ang. capatility) w przestrzeni nazw uzytkownika, ktora zarzadza jego przestrzenia nazw IPC. EEXIST IPC_CREAT i IPC_EXCL okreslono w msgflg, lecz kolejka wiadomosci dla key juz istnieje. ENOENT Kolejka skojarzona z wartoscia key nie istnieje oraz nie podano flagi IPC_CREAT w msgflg. ENOMEM Kolejka komunikatow powinna zostac utworzona, ale w systemie brak jest pamieci na utworzenie nowej struktury danych. ENOSPC Kolejka komunikatow powinna zostac utworzona, ale przekroczone zostaloby systemowe ograniczenie (MSGMNI) na liczbe istniejacych kolejek komunikatow. STANDARDY POSIX.1-2008. HISTORIA POSIX.1-2001, SVr4. Linux Do Linuksa 2.3.20 Linux zwracal EIDRM dla msgget() na kolejce komunikatow przeznaczonej do skasowania. UWAGI IPC_PRIVATE nie jest znacznikiem, ale szczegolna wartoscia typu key_t. Jesli wartosc ta zostanie uzyta jako parametr key, to system uwzgledni jedynie 9 najnizszych bitow parametru msgflg i (w razie powodzenia) utworzy nowa kolejke. Nastepujace ograniczenia systemowe dotycza wywolania msgget(): MSGMNI Systemowy limit liczby kolejek komunikatow. Przed Linuksem 3.19 domyslna wartosc limitu obliczano wzorem opartym na dostepnej pamieci systemowej. Od Linuksa 3.19 domyslna wartosc wynosi 32 000. Pod Linuksem to ograniczenie mozna odczytac i zmienic, uzywajac pliku /proc/sys/kernel/msgmni. USTERKI Nazwa IPC_PRIVATE prawdopodobnie nie jest najszczesliwsza. IPC_NEW w sposob bardziej przejrzysty odzwierciedlaloby role tej wartosci. ZOBACZ TAKZE msgctl(2), msgrcv(2), msgsnd(2), ftok(3), capabilities(7), mq_overview(7), sysvipc(7) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Rafal Lewczuk , Andrzej Krzysztofowicz , Robert Luberda i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.9.1 2 maja 2024 r. msgget(2)