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¶
SVr4, POSIX.1-2001.
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: wartość
zależna od lokalnych ustawień (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 3.71 projektu Linux
man-pages. Opis projektu, informacje dotyczące zgłaszania
błędów, oraz najnowszą wersję
oryginału można znaleźć pod adresem
http://www.kernel.org/doc/man-pages/.
TŁUMACZENIE¶
Autorami polskiego tłumaczenia niniejszej strony podręcznika man
są: Rafał Lewczuk (PTM) <R.Lewczuk@elka.pw.edu.p>, Andrzej
Krzysztofowicz (PTM) <ankry@mif.pg.gda.pl>, Robert Luberda
<robert@debian.org> i Michał Kułach
<michal.kulach@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ą
3.71 oryginału.