msgget - pobranie identyfikatora kolejki komunikatów Systemu V
Standardowa biblioteka C (
libc,
-lc)
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
The
msgget() system call returns the System V message queue
identifier associated with the value of the
key argument. It may be
used either to obtain the identifier of a previously created message queue
(when
msgflg is zero and
key does not have the value
IPC_PRIVATE), or to create a new set.
A new message queue is created if
key has the value
IPC_PRIVATE or
key isn't
IPC_PRIVATE, no message queue with the given key
key exists, and
IPC_CREAT is specified in
msgflg.
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.
On success,
msgget() returns the message queue identifier (a nonnegative
integer). On failure, -1 is returned, and
errno is set to indicate the
error.
- EACCES
- A message queue exists for key, but the calling
process does not have permission to access the queue, and does not have
the CAP_IPC_OWNER capability in the user namespace that governs its
IPC namespace.
- 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.
POSIX.1-2001, POSIX.1-2008, SVr4.
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.
Until Linux 2.3.20, Linux would return
EIDRM for a
msgget() on a
message queue scheduled for deletion.
Nazwa
IPC_PRIVATE prawdopodobnie nie jest najszczęśliwsza.
IPC_NEW w sposób bardziej przejrzysty odzwierciedlałoby
rolę tej wartości.
msgctl(2),
msgrcv(2),
msgsnd(2),
ftok(3),
capabilities(7),
mq_overview(7),
sysvipc(7)
Autorami polskiego tłumaczenia niniejszej strony podręcznika
są: Rafał Lewczuk <
[email protected]>, Andrzej
Krzysztofowicz <
[email protected]>, Robert Luberda
<
[email protected]> i Michał Kułach
<
[email protected]>
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
[email protected]