MSGSND(2) | System Calls Manual | MSGSND(2)

# NAME

`msgsnd` — send a message to a message queue

# SYNOPSIS

`#include <sys/msg.h>`

int
`msgsnd`(int msqid, const void *msgp, size_t msgsz, int msgflg);

# DESCRIPTION

The `msgsnd`() function sends a message to the message queue specified by msqid. msgp points to a structure containing the message. This structure should consist of the following members:

    long mtype;    /* message type */
    char mtext[1]; /* body of message */

mtype is an integer greater than 0 that can be used for selecting messages (see msgrcv(2)); mtext is an array of msgsz bytes, with a size between 0 and that of the system limit (`MSGMAX`).

If the number of bytes already on the message queue plus msgsz is bigger than the maximum number of bytes on the message queue (msg_qbytes,
see msgctl(2)), or the number of messages on all queues system-wide is already equal to the system limit, msgflg determines the action of `msgsnd`(). If msgflg has `IPC_NOWAIT` mask set in it, the call will return immediately. If msgflg does not have `IPC_NOWAIT` set in it, the call will block until:

- The condition which caused the call to block does no longer exist. The message will be sent.
- The message queue is removed, in which case -1 will be returned, and errno is set to `EIDRM`.
- The caller catches a signal. The call returns with errno set to `EINTR`.

After a successful call, the data structure associated with the message queue is updated in the following way:

- msg_cbytes is incremented by the size of the message.
- msg_qnum is incremented by 1.
- msg_lspid is set to the pid of the calling process.
- msg_stime is set to the current time.

# RETURN VALUES

Upon successful completion, the value 0 is returned; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

# ERRORS

`msgsnd`() will fail if:

[`EINVAL`]
  msqid is not a valid message queue identifier.

  mtype is less than 1.

  msgsz is greater than msg_qbytes.

[`EACCES`]
  The calling process does not have write access to the message queue.
[`EAGAIN`]
  There was no space for this message either on the queue, or in the whole system, and `IPC_NOWAIT` was set in msgflg.
[`EFAULT`]
  msgp points to an invalid address.
[`EINTR`]
  The system call was interrupted by the delivery of a signal.
[`EIDRM`]
  The message queue was removed while `msgsnd`() was waiting for a resource to become available in order to deliver the message.

# SEE ALSO

msgctl(2), msgget(2), msgrcv(2)

# STANDARDS

The `msgsnd`() function conforms to the X/Open System Interfaces option of IEEE Std 1003.1-2008 (“POSIX.1”).

# HISTORY

Message queues first appeared in AT&T System V Release 1 UNIX and have been available since NetBSD 1.0.

July 18, 2019 | Debian