NAZWA¶
msgctl - sterowanie kolejkami komunikatów
SKŁADNIA¶
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl(int msqid, int cmd,
struct msqid_ds *buf);
OPIS¶
Uwaga! To tłumaczenie może być nieaktualne!
Funkcja ta wykonuje operację określoną przez parametr
cmd
na kolejce komunikatów o identyfikatorze
msqid.
Struktura danych
msqid_ds jest zdefiniowana w <sys/msg.h>
następująco:
struct msqid_ds {
struct ipc_perm msg_perm; /* Własności i uprawnienia */
time_t msg_stime; /* Czas ostatniego msgsnd() */
time_t msg_rtime; /* Czas ostatniego msgrcv() */
time_t msg_ctime; /* Czas ostatniej zmiany */
unsigned long __msg_cbytes; /* Bieżąca liczba bajtów w
kolejce (niestandardowy) */
msgqnum_t msg_qnum; /* Bieżąca liczba komunikatów
w kolejce */
msglen_t msg_qbytes; /* Maksymalna liczba dostępnych
bajtów w kolejce */
pid_t msg_lspid; /* PID ostatniego msgsnd() */
pid_t msg_lrpid; /* PID ostatniego msgrcv() */
};
Struktura
ipc_perm jest zdefiniowana w <sys/ipc.h>
następująco (wyróżnione pola można ustawić za
pomocą
IPC_SET):
struct ipc_perm {
key_t key; /* Klucz podany w msgget() */
uid_t uid; /* Efektywny UID właściciela */
gid_t gid; /* Efektywny GID właściciela */
uid_t cuid; /* Efektywny UID twórcy */
gid_t cgid; /* Efektywny GID twórcy */
unsigned short mode; /* Uprawnienia */
unsigned short seq; /* Numer sekwencji */
};
Dozwolone wartości
cmd to:
- IPC_STAT
- Kopiowanie informacji ze struktury kontrolnej kolejki
komunikatów, skojarzonej z msqid, do struktury wskazywanej
przez buf. Wywołujący musi mieć prawo odczytu
kolejki komunikatów.
- IPC_SET
- Zapis wartości niektórych pól struktury
msqid_ds wskazywanej przez parametr buf do struktury
kontrolnej kolejki komunikatów. Pole msg_ctime zostanie
automatycznie uaktualnione. Zaktualizowane mogą również
zostać następujące pola tej struktury: msg_qbytes,
msg_perm.uid, msg_perm.gid i (przynajmniej 9 najmniej
znaczących bitów z) msg_perm.mode. Efektywny
identyfikator użytkownika musi wskazywać na
właściciela (msg_perm.uid) lub na twórcę
(msg_perm.uid) kolejki komunikatów albo proces
wywołujący musi być uprzywilejowany. Odpowiednie
uprawnienia (Linux: zdolność CAP_IPC_RESOURCE) są
również wymagane, aby nadać polu msg_qbytes
wartość większą niż parametr systemowy
MSGMNB.
- IPC_RMID
- Natychmiastowe usunięcie kolejki komunikatów i
skojarzonej z nią struktury danych. Wszystkie procesy oczekujące
na zapis lub odczyt z kolejki zostaną wznowione i wywołania,
które wykonywały zasygnalizują błąd
(przypisując zmiennej errno wartość EIDRM).
Proces wywołujący tę funkcję musi mieć
odpowiednie uprawnienia (prawdopodobnie uprawnienia użytkownika
root), ewentualnie jego efektywny identyfikator użytkownika musi
wskazywać na twórcę lub na właściciela kolejki
komunikatów.
WARTOŚĆ ZWRACANA¶
Po pomyślnym zakończeniu, funkcja zwróci wartość 0, w
przeciwnym przypadku -1, a zmiennej
errno zostanie nadana
wartość określająca rodzaj błędu.
BŁĘDY¶
W przypadku niepomyślnego zakończenia funkcji, zmiennej
errno
zostanie nadana jedna z następujących wartości:
- EACCES
- Parametr cmd jest równy IPC_STAT lub
MSG_STAT , ale proces wywołujący funkcję nie ma
prawa do odczytu wskazywanej przez msqid kolejki komunikatów
ani nie ma zdolności CAP_IPC_OWNER.
- EFAULT
- Parametr cmd ma wartość IPC_SET lub
IPC_STAT, ale buf wskazuje na niedostępny obszar
pamięci.
- EIDRM
- Kolejka komunikatów została usunięta.
- EINVAL
- Niewłaściwa wartość parametru
cmd lub msqid.
- EPERM
- Parametr cmd jest równy IPC_SET lub
IPC_RMID, ale proces wywołujący funkcję nie jest
twórcą (określonym w msg_perm.cuid) ani
właścicielem (określonym w msg_perm.uid) kolejki
komunikatów, a proces nie jest uprzywilejowany (Linux: nie ma
zdolności CAP_SYS_ADMIN). Niektóre pola struktury
struct msqid_ds były w Linuksie 2.2 typu short a stały
się typu long w Linuksie 2.4. Aby to wykorzystać, powinna
wystarczyć rekompilacja pod glibc-2.1.91 lub nowszą. (Jądro
rozróżnia stare i nowe wywołania za pomocą znacznika
IPC_64 w cmd).
ZGODNE Z¶
SVr4, SVID. Kod błędu EIDRM nie został udokumentowany w SVID.
ZOBACZ TAKŻE¶
msgget(2),
msgrcv(2),
msgsnd(2),
ipc(5),
capabilities(7)
Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu
Tłumaczenia Manuali i
może nie być aktualne. W razie
zauważenia różnic między powyższym opisem a
rzeczywistym zachowaniem opisywanego programu lub funkcji, prosimy o
zapoznanie się z oryginalną (angielską) wersją strony
podręcznika za pomocą polecenia:
- man --locale=C 2 msgctl
Prosimy o pomoc w aktualizacji stron man - więcej informacji można
znaleźć pod adresem
http://sourceforge.net/projects/manpages-pl/.