p Each message queue has a .Sy msqid_ds structure associated with it which contains the following members: d -literal struct ipc_perm msg_perm; /* msg queue permission bits */ msgqnum_t msg_qnum; /* # 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() */ .Ed
p The .Sy ipc_perm structure used inside the .Sy msgid_ds structure is defined in n sys/ipc.h and contains the following members: d -literal 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; /* permission (lower 9 bits) */ .Ed
p The operation to be performed by .Fn msgctl is specified in .Fa cmd and is one of: l -tag -width IPC_RMIDX t Dv IPC_STAT Gather information about the message queue and place it in the structure pointed to by .Fa buf . t Dv IPC_SET Set the value of the .Va msg_perm.uid , .Va msg_perm.gid , .Va msg_perm.mode and .Va msg_qbytes fields in the structure associated with .Fa msqid . The values are taken from the corresponding fields in the structure pointed to by .Fa buf . This operation can only be executed by the super-user, or a process that has an effective user id equal to either .Va msg_perm.cuid or .Va msg_perm.uid in the data structure associated with the message queue. The value of .Va msg_qbytes can only be increased by the super-user. Values for .Va msg_qbytes that exceed the system limit
f ( Dv MSGMNB from n sys/msg.h ) are silently truncated to that limit. t Dv IPC_RMID Remove the message queue specified by .Fa msqid and destroy the data associated with it. Only the super-user or a process with an effective uid equal to the .Va msg_perm.cuid or .Va msg_perm.uid values in the data structure associated with the queue can do this. .El
p The permission to read from or write to a message queue (see .Xr msgsnd 2 and .Xr msgrcv 2 ) is determined by the .Va msg_perm.mode field in the same way as is done with files (see .Xr chmod 2 ) , but the effective uid can match either the .Va msg_perm.cuid field or the .Va msg_perm.uid field, and the effective gid can match either .Va msg_perm.cgid or .Va msg_perm.gid . .Sh RETURN VALUES Upon successful completion, a value of 0 is returned. Otherwise, -1 is returned and the global variable .Va errno is set to indicate the error. .Sh ERRORS .Fn msgctl will fail if: l -tag -width Er t Bq Er EPERM .Fa cmd is equal to .Dv IPC_SET or .Dv IPC_RMID and the caller is not the super-user, nor does the effective uid match either the .Va msg_perm.uid or .Va msg_perm.cuid fields of the data structure associated with the message queue.
p An attempt was made to increase the value of .Va msg_qbytes through .Dv IPC_SET , but the caller is not the super-user. t Bq Er EACCES .Fa cmd is .Dv IPC_STAT and the caller has no read permission for this message queue. t Bq Er EINVAL .Fa msqid is not a valid message queue identifier.
p .Fa cmd is not a valid command. t Bq Er EFAULT .Fa buf specifies an invalid address. .El .Sh SEE ALSO .Xr msgget 2 , .Xr msgrcv 2 , .Xr msgsnd 2 .Sh STANDARDS The .Nm system call conforms to .St -xsh5 . .Sh HISTORY Message queues appeared in the first release of .At V .