Scroll to navigation

msgget(2) System Calls Manual msgget(2)

NAZWA

msgget - pobiera identyfikator kolejki komunikatów Systemu V

BIBLIOTEKA

Standardowa biblioteka C (libc, -lc)

SKŁADNIA

#include <sys/msg.h>
int msgget(key_t key, int msgflg);

OPIS

Wywołanie systemowe msgget() zwraca identyfikator kolejki komunikatów Systemu V skojarzony z wartością argumentu key. Może posłużyć do uzyskania identyfikatora poprzednio utworzonej kolejki komunikatów (gdy msgflg wynosi zero, a key nie ma wartości IPC_PRIVATE) lub do utworzenia nowego zestawu.

Tworzy nową kolejkę komunikatów, gdy key ma wartość IPC_PRIVATE lub gdy key jest różny od IPC_PRIVATE i nie istnieje kolejka o kluczu podanym w key, a w parametrze msgflg ustawiono IPC_CREAT.

Jeśli w parametrze msgflg podano zarówno IPC_CREAT, jak i IPC_EXCL oraz już istnieje kolejka komunikatów o kluczu key, to msgget() kończy się błędem, ustawiając errno na wartość EEXIST. (Działa to analogicznie do O_CREAT | O_EXCL w open(2)).

Podczas tworzenia kolejki najmniej znaczące bity argumentu msgflg definiują prawa dostępu do niej. Prawa te mają taką samą postać i znaczenie (semantykę) jak prawa dostępu podawane w parametrze mode wywołania open(2) (Prawa do uruchamiania nie są używane).

Jeśli tworzona jest nowa kolejka komunikatów, wywołanie to w następujący sposób inicjuje strukturę danych msqid_ds (patrz msgctl(2)):

msg_perm.cuid i msg_perm.uid przyjmują wartość efektywnego identyfikatora właściciela procesu wywołującego.
msg_perm.cgid i msg_perm.gid przyjmują wartość efektywnego identyfikatora grupy procesu wywołującego.
9 najmniej znaczących bitów pola msg_perm.mode jest kopiowanych z 9 najmniej znaczących bitów msgflg.
msg_qnum, msg_lspid, msg_lrpid, msg_stime i msg_rtime przyjmują wartość 0.
msg_ctime jest ustawiane na bieżący czas.
msg_qbytes przyjmuje wartość równą ograniczeniu systemowemu MSGMNB.

Jeśli kolejka już istnieje, to są weryfikowane uprawnienia i jest sprawdzane, czy kolejka nie jest przeznaczona do usunięcia.

WARTOŚĆ ZWRACANA

W przypadku powodzenia, msgget() zwraca identyfikator kolejki komunikatów (liczbę nieujemną). W razie wystąpienia błędu zwracane jest -1 i ustawiane errno wskazując błąd.

BŁĘDY

Kolejka komunikatów skojarzona z key istnieje, jednakże proces wywołujący funkcję nie ma ani wystarczających praw dostępu do tej kolejki, ani nie ma ustawionego przywileju CAP_IPC_OWNER (ang. capatility) w przestrzeni nazw użytkownika, która zarządza jego przestrzenią nazw IPC.
IPC_CREAT i IPC_EXCL określono w msgflg, lecz kolejka wiadomości dla key już istnieje.
Kolejka skojarzona z wartością key nie istnieje oraz nie podano flagi IPC_CREAT w msgflg.
Kolejka komunikatów powinna zostać utworzona, ale w systemie brak jest pamięci na utworzenie nowej struktury danych.
Kolejka komunikatów powinna zostać utworzona, ale przekroczone zostałoby systemowe ograniczenie (MSGMNI) na liczbę istniejących kolejek komunikatów.

STANDARDY

POSIX.1-2001, POSIX.1-2008, SVr4.

UWAGI

IPC_PRIVATE nie jest znacznikiem, ale szczególną wartością typu key_t. Jeśli wartość ta zostanie użyta jako parametr key, to system uwzględni jedynie 9 najniższych bitów parametru msgflg i (w razie powodzenia) utworzy nową kolejkę.

Następujące ograniczenia systemowe dotyczą wywołania msgget():

Systemowy limit liczby kolejek komunikatów. Przed Linuksem 3.19 domyślną wartość limitu obliczano wzorem opartym na dostępnej pamięci systemowej. Od Linuksa 3.19 domyślna wartość wynosi 32 000. Pod Linuksem to ograniczenie można odczytać i zmienić, używając pliku /proc/sys/kernel/msgmni.

Uwagi linuksowe

Do Linuksa 2.3.20 Linux zwracał EIDRM dla msgget() na kolejce komunikatów przeznaczonej do skasowania.

USTERKI

Nazwa IPC_PRIVATE prawdopodobnie nie jest najszczęśliwsza. IPC_NEW w sposób bardziej przejrzysty odzwierciedlałoby rolę tej wartości.

ZOBACZ TAKŻE

msgctl(2), msgrcv(2), msgsnd(2), ftok(3), capabilities(7), mq_overview(7), sysvipc(7)

TŁUMACZENIE

Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Rafał Lewczuk <R.Lewczuk@elka.pw.edu.p>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>, Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.

5 lutego 2023 r. Linux man-pages 6.03