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; /* body of message */
mtype is an integer greater than 0 that can be used for selecting messages (see msgrcv(3)), mtext is an array of bytes, with a size up to 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(3)), 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.