NAME
msgctl - message control operations
SYNOPSIS
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
I int msgctl(int msqid ,
I int cmd ,
I struct msqid_ds * buf );
DESCRIPTION
R msgctl ()
performs the control operation specified by
cmd
on the message queue with identifier
R msqid .
The
msqid_ds
data structure is defined in
<sys/msg.h> as follows:
struct msqid_ds {
struct ipc_perm msg_perm; /* Ownership and permissions */
time_t msg_stime; /* Time of last msgsnd(2) */
time_t msg_rtime; /* Time of last msgrcv(2) */
time_t msg_ctime; /* Time of last change */
unsigned long __msg_cbytes; /* Current number of bytes in
queue (non-standard) */
msgqnum_t msg_qnum; /* Current number of messages
in queue */
msglen_t msg_qbytes; /* Maximum number of bytes
allowed in queue */
pid_t msg_lspid; /* PID of last msgsnd(2) */
pid_t msg_lrpid; /* PID of last msgrcv(2) */
};
The
ipc_perm
structure is defined in <sys/ipc.h> as follows
(the highlighted fields are settable using
R IPC_SET ):
struct ipc_perm {
key_t key; /* Key supplied to msgget(2) */
uid_t uid; /* Effective UID of owner */
gid_t gid; /* Effective GID of owner */
uid_t cuid; /* Effective UID of creator */
gid_t cgid; /* Effective GID of creator */
unsigned short mode; /* Permissions */
unsigned short seq; /* Sequence number */
};
Valid values for
cmd
are:
IPC_STAT
Copy information from the kernel data structure associated with
msqid
into the
msqid_ds
structure pointed to by
R buf .
The caller must have read permission on the message queue.
IPC_SET
Write the values of some members of the
msqid_ds
structure pointed to by
buf
to the kernel data structure associated with this message queue,
updating also its
msg_ctime
member.
The following members of the structure are updated:
R msg_qbytes ,
R msg_perm.uid ,
R msg_perm.gid ,
and (the least significant 9 bits of)
R msg_perm.mode .
The effective UID of the calling process must match the owner
(msg_perm.uid)
or creator
(msg_perm.cuid)
of the message queue, or the caller must be privileged.
Appropriate privilege (Linux: the
CAP_IPC_RESOURCE
capability) is required to raise the
msg_qbytes
value beyond the system parameter
R MSGMNB .
IPC_RMID
Immediately remove the message queue,
awakening all waiting reader and writer processes (with an error
return and
errno
set to
R EIDRM ).
The calling process must have appropriate privileges
or its effective user ID must be either that of the creator or owner
of the message queue.
R IPC_INFO (Linux specific)
Returns information about system-wide message queue limits and
parameters in the structure pointed to by
R buf .
This structure is of type
R msginfo
(thus, a cast is required),
defined in
<sys/msg.h>
if the
R _GNU_SOURCE
feature test macro is defined:
struct msginfo {
int msgpool; /* Size in bytes of buffer pool used
to hold message data; unused */
int msgmap; /* Max. # of entries in message
map; unused */
int msgmax; /* Max. # of bytes that can be
written in a single message */
int msgmnb; /* Max. # of bytes that can be written to
queue; used to initialize msg_qbytes
during queue creation (msgget(2)) */
int msgmni; /* Max. # of message queues */
int msgssz; /* Message segment size; unused */
int msgtql; /* Max. # of messages on all queues
in system; unused */
unsigned short int msgseg;
/* Max. # of segments; unused */
};
The
R msgmni ,
R msgmax ,
and
msgmnb
settings can be changed via
/proc
files of the same name; see
proc(5)
for details.
R MSG_INFO (Linux specific)
Returns a
msginfo
structure containing the same information as for
R IPC_INFO ,
except that the following fields are returned with information
about system resources consumed by message queues: the
msgpool
field returns the number of message queues that currently exist
on the system; the
msgmap
field returns the total number of messages in all queues
on the system; and the
msgtql
field returns the total number of bytes in all messages
in all queues on the system.
R MSG_STAT (Linux specific)
Returns a
msqid_ds
structure as for
R IPC_STAT .
However, the
msqid
argument is not a queue identifier, but instead an index into
the kernel's internal array that maintains information about
all message queues on the system.
RETURN VALUE
On success,
R IPC_STAT ,
R IPC_SET ,
and
R IPC_RMID
return 0.
A successful
IPC_INFO
or
MSG_INFO
operation returns the index of the highest used entry in the
kernel's internal array recording information about all
message queues.
(This information can be used with repeated
MSG_STAT
operations to obtain information about all queues on the system.)
A successful
MSG_STAT
operation returns the identifier of the queue whose index was given in
R msqid .
On error, -1 is returned with
errno
indicating the error.
ERRORS
On failure,
errno
is set to one of the following:
EACCES
The argument
cmd
is equal to
R IPC_STAT
or
R MSG_STAT ,
but the calling process does not have read permission on the message queue
R msqid ,
and does not have the
CAP_IPC_OWNER
capability.
EFAULT
The argument
cmd
has the value
IPC_SET
or
R IPC_STAT ,
but the address pointed to by
buf
isn't accessible.
EIDRM
The message queue was removed.
EINVAL
Invalid value for
cmd
or
R msqid .
Or: for a
MSG_STAT
operation, the index value specified in
msqid
referred to an array slot that is currently unused.
EPERM
The argument
cmd
has the value
IPC_SET
or
R IPC_RMID ,
but the effective user ID of the calling process is not the creator
(as found in
R msg_perm.cuid )
or the owner
(as found in
R msg_perm.uid )
of the message queue,
and the process is not privileged (Linux: it does not have the
CAP_SYS_ADMIN
capability).
CONFORMING TO
SVr4, POSIX.1-2001.
NOTES
The
R IPC_INFO ,
R MSG_STAT
and
MSG_INFO
operations are used by the
ipcs(8)
program to provide information on allocated resources.
In the future these may modified or moved to a /proc file system
interface.
Various fields in the
struct msqid_ds were shorts under Linux 2.2
and have become longs under Linux 2.4.
To take advantage of this,
a recompilation under glibc-2.1.91 or later should suffice.
(The kernel distinguishes old and new calls by an
R IPC_64
flag in
R cmd .)
SEE ALSO