msgsnd(2freebsd)

msgsnd2freebsd

Send a message to a message queue

Usage

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

int

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

Library

Standard C Library (libc, -lc)

Overview

The msgsnd() function sends a message to the message queue specified in msqid. The msgp argument 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. The argument msgsz can range from 0 to a system-imposed maximum, 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 EINVAL.

  • 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

The msgsnd() function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

Errors

The msgsnd() function will fail if:

[EINVAL]

The msqid argument is not a valid message queue identifier.

The message queue was removed while msgsnd() was waiting for a resource to become available in order to deliver the message.

The msgsz argument is greater than msg_qbytes.

The mtype argument is not greater than 0.

[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]

The msgp argument points to an invalid address.

[EINTR]

The system call was interrupted by the delivery of a signal.

Releases

8 releases since Debian 6.0 (Squeeze); the text changed 5 times.

  1. 6.0
  2. 7
  3. 8
  4. 9
  5. 10
  6. 11–13

History

Message queues appeared in the first release of AT&T Unix System V.

Bugs

NetBSD and FreeBSD do not define the EIDRM error value, which should be used in the case of a removed message queue.

From freebsd-manpages 12.2-2 in Debian 13 (Trixie). Parsed by carta from the page's mdoc source.