Manpages

NAZWA

msgget − pobranie identyfikatora kolejki komunikatów Systemu V

SKŁADNIA

#include <sys/types.h>
#include <sys/ipc.h>
#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. 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 pomyślnego zakończenia, funkcja zwraca identyfikator kolejki komunikatów (liczbę nieujemną), a w przeciwnym przypadku zwraca −1 i przypisuje zmiennej errno stosowną wartość.

BŁĘDY

W przypadku niepowodzenia zmienna errno może przyjąć jedną z następujących wartości:

EACCES

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 atrybutu CAP_IPC_OWNER.

EEXIST

IPC_CREAT i IPC_EXCL określono w msgflg, lecz kolejka wiadomości dla key już istnieje.

ENOENT

Kolejka skojarzona z wartością key nie istnieje oraz nie podano flagi IPC_CREAT w msgflg.

ENOMEM

Kolejka komunikatów powinna zostać utworzona, ale w systemie brak jest pamięci na utworzenie nowej struktury danych.

ENOSPC

Kolejka komunikatów powinna zostać utworzona, ale przekroczone zostałoby systemowe ograniczenie (MSGMNI) na liczbę istniejących kolejek komunikatów.

ZGODNE Z

POSIX.1−2001, POSIX.1−2008, SVr4.

UWAGI

Dołączenie <sys/types.h> i <sys/ipc.h> nie jest wymagane na Linuksie ani przez żadną z wersji POSIX. Jednak niektóre stare implementacje wymagają dołączenia tych plików nagłówkowych, SVID również dokumentuje ich dołączenie. Aplikacje które mają być przenośne na tego typu stare systemy mogą wymagać dołączenia omawianych plików nagłówkowych.

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():

MSGMNI

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 wersji 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), svipc(7)

O STRONIE

Angielska wersja tej strony pochodzi z wydania 4.07 projektu Linux man−pages. Opis projektu, informacje dotyczące zgłaszania błędów, oraz najnowszą wersję oryginału można znaleźć pod adresem https://www.kernel.org/doc/man−pages/.

TŁUMACZENIE

Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Rafał Lewczuk (PTM) <R.Lewczuk [AT] elka.p>, Andrzej Krzysztofowicz (PTM) <ankry [AT] mif.pl>, Robert Luberda <robert [AT] debian.org> i Michał Kułach <michal.kulach [AT] gmail.com>.

Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów na stronie http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją 4.07 oryginału.

COMMENTS