MSGCTL(2)
π MSGCTL(2) β message control operations π
okay bestie, sit down, hydrate, because today we're learning msgctl β the System Calls Manual page that lets you boss around your message queues. no cap, this is the group-chat admin of the SysV IPC world. π
LIBRARY: Standard C Library (libc, -lc) β she's built in, you don't gotta install anything. iconic.
β¨ SYNOPSIS β¨
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int
msgctl(int msqid, int cmd, struct msqid_ds *buf);
πΈ DESCRIPTION πΈ
The msgctl() system call performs some control operations on the message queue specified by msqid. literally it's the "manage my queue" button. the way that every queue deserves a lil manager π
Every message queue has a data structure associated with it, and parts of it can be altered by msgctl() while other parts determine what msgctl() does. it's giving mutual. that structure lives in <sys/msg.h> and contains (amongst others) these members:
struct msqid_ds {
struct ipc_perm msg_perm; /* msg queue permission bits */
msglen_t msg_cbytes; /* number of bytes in use on the queue */
msgqnum_t msg_qnum; /* number of msgs in the queue */
msglen_t msg_qbytes; /* max # of bytes on the queue */
pid_t msg_lspid; /* pid of last msgsnd() */
pid_t msg_lrpid; /* pid of last msgrcv() */
time_t msg_stime; /* time of last msgsnd() */
time_t msg_rtime; /* time of last msgrcv() */
time_t msg_ctime; /* time of last msgctl() */
};
and the ipc_perm structure that's chilling inside msqid_ds? that one's defined in <sys/ipc.h> and looks like this:
struct ipc_perm {
uid_t cuid; /* creator user id */
gid_t cgid; /* creator group id */
uid_t uid; /* user id */
gid_t gid; /* group id */
mode_t mode; /* r/w permission */
unsigned short seq; /* sequence # (to generate unique ipcid) */
key_t key; /* user specified msg/sem/shm key */
};
so. the operation msgctl() performs is specified in cmd, and it's one of these three besties:
IPC_STATβ Gather information about the message queue and place it in the structure pointed to bybuf. it's the "spill the tea, what's going on in there" command. πIPC_SETβ Set the value of themsg_perm.uid,msg_perm.gid,msg_perm.modeandmsg_qbytesfields in the structure associated withmsqid. the values come from the corresponding fields in the structure pointed to bybuf. β¨
π¨ BUT: this operation can only be executed by the super-user, or a process that has an effective user id equal to eithermsg_perm.cuidormsg_perm.uidin the data structure associated with the message queue. and the value ofmsg_qbytescan only be increased by the super-user. values formsg_qbytesthat exceed the system limit (MSGMNBfrom<sys/msg.h>) are silently truncated to that limit. silently!! no warning, no text back, just vibes. π
IPC_RMIDβ Remove the message queue specified bymsqidand destroy the data associated with it. it's the block-and-delete. only the super-user or a process with an effective uid equal to themsg_perm.cuidormsg_perm.uidvalues in the data structure associated with the queue can do this. π₯
Permission to read from or write to a message queue (see msgsnd(2) and msgrcv(2)) is determined by the msg_perm.mode field in the same way as is done with files (see chmod(2)), except here's the twist: the effective uid can match either the msg_perm.cuid field or the msg_perm.uid field, and the effective gid can match either msg_perm.cgid or msg_perm.gid. two chances to get in, we love options π«Ά
π RETURN VALUES π
The msgctl() function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error. so like, 0 = slay, -1 = check errno, bestie. π
π ERRORS π
The msgctl() function will fail if:
[EPERM]β Thecmdargument is equal toIPC_SETorIPC_RMIDand the caller is not the super-user, nor does the effective uid match either themsg_perm.uidormsg_perm.cuidfields of the data structure associated with the message queue.
also: an attempt is made to increase the value of msg_qbytes through IPC_SET but the caller is not the super-user. π
[EACCES]β The command isIPC_STATand the caller has no read permission for this message queue. no read perms, no tea. π[EINVAL]β Themsqidargument is not a valid message queue identifier.
or: cmd is not a valid command. π«
[EFAULT]β Thebufargument specifies an invalid address. that pointer is giving nowhere. π»
π¦ SEE ALSO π¦
msgget(2), msgrcv(2), msgsnd(2)
π HISTORY π
Message queues appeared in the first release of AT&T System V UNIX. yes she's old old. vintage. archival. still serving though. periodt. β¨
and that's the whole page, bestie!! π this was the Debian flavour of MSGCTL(2), dated July 9, 2020 β go forth and control your message queues responsibly, mwah π
π¦ where this page comes from
- debian bookworm: freebsd-manpages 12.2-1 Β· BSD-2-Clause-FreeBSD AND BSD-4-Clause
- debian trixie: freebsd-manpages 12.2-2 Β· BSD-2-Clause-FreeBSD AND BSD-4-Clause
- ubuntu jammy: freebsd-manpages 12.2-1 Β· BSD-2-Clause-FreeBSD AND BSD-4-Clause
- ubuntu noble: freebsd-manpages 12.2-1 Β· BSD-2-Clause-FreeBSD AND BSD-4-Clause
- ubuntu questing: freebsd-manpages 12.2-2
- ubuntu resolute: freebsd-manpages 12.2-2build1 Β· BSD-2-Clause-FreeBSD AND BSD-4-Clause
- ubuntu stonking: freebsd-manpages 12.2-2build1 Β· BSD-2-Clause-FreeBSD AND BSD-4-Clause
- Copyright (c) 1995 Frank van der Linden
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms