Originální popis anglicky:
msgget - get a message queue identifier
Návod, kniha: Linux Programmer's Manual
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
The function returns the message queue identifier associated with the value of
the
key argument. 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 asserted
in
msgflg (i.e.,
msgflg&IPC_CREAT is nonzero).
The presence in
msgflg of the fields
IPC_CREAT and
IPC_EXCL plays the same role, with respect to the existence of the
message queue, as the presence of
O_CREAT and
O_EXCL in the mode
argument of the
open(2) system call: i.e. the
msgget function
fails if
msgflg asserts both
IPC_CREAT and
IPC_EXCL and a
message queue already exists for
key.
Upon creation, the lower 9 bits of the argument
msgflg define the access
permissions of the message queue. These permission bits have the same format
and semantics as the access permissions parameter in
open(2) or
creat(2) system calls. (The execute permissions are not used.)
If a new message queue is created, the system call initializes the system
message queue data structure
msqid_ds as follows:
- msg_perm.cuid and msg_perm.uid are set to the
effective user-ID of the calling process.
- msg_perm.cgid and msg_perm.gid are set to the
effective group-ID of the calling process.
- The lowest order 9 bits of msg_perm.mode are set to
the lowest order 9 bit of msgflg.
- msg_qnum, msg_lspid, msg_lrpid,
msg_stime and msg_rtime are set to 0.
- msg_ctime is set to the current time.
- msg_qbytes is set to the system limit
MSGMNB.
If the message queue already exists the access permissions are verified, and a
check is made to see if it is marked for destruction.
If successful, the return value will be the message queue identifier (a
nonnegative integer), otherwise
-1 with
errno indicating the
error.
On failure,
errno is set to one of the following values:
- 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.
- EEXIST
- A message queue exists for key and msgflg was
asserting both IPC_CREAT and IPC_EXCL.
- ENOENT
- No message queue exists for key and msgflg
wasn't asserting IPC_CREAT.
- ENOMEM
- A message queue has to be created but the system has not
enough memory for the new data structure.
- ENOSPC
- A message queue has to be created but the system limit for
the maximum number of message queues (MSGMNI) would be
exceeded.
IPC_PRIVATE isn't a flag field but a
key_t type. If this special
value is used for
key, the system call ignores everything but the
lowest order 9 bits of
msgflg and creates a new message queue (on
success).
The following is a system limit on message queue resources affecting a
msgget call:
- MSGMNI
- System wide maximum number of message queues: policy
dependent.
The name choice IPC_PRIVATE was perhaps unfortunate, IPC_NEW would more clearly
show its function.
SVr4, SVID. Until version 2.3.20 Linux would return EIDRM for a
msgget on
a message queue scheduled for deletion.
msgctl(2),
msgrcv(2),
msgsnd(2),
ftok(3),
ipc(5),
capabilities(7)