[ Previous | Next | Table of Contents | Index | Library Home |
Legal |
Search ]
Technical Reference: Base Operating System and Extensions, Volume 1
Sends a message.
Standard C Library
(libc.a)
#include <sys/msg.h>
int msgsnd (MessageQueueID, MessagePointer,MessageSize, MessageFlag)
int MessageQueueID, MessageFlag;
const void * MessagePointer;
size_t MessageSize;
The msgsnd subroutine
sends a message to the queue specified by the MessageQueueID
parameter. The current process must have write permission to perform
this operation. The MessagePointer parameter points to an
msgbuf structure containing the message. The
sys/msg.h file defines the msgbuf
structure. The structure contains the following fields:
mtyp_t mtype; /* Message type */
char mtext[1]; /* Beginning of message text */
The mtype
field specifies a positive integer used by the receiving process for message
selection. The mtext field can be any text of the length in
bytes specified by the MessageSize parameter. The
MessageSize parameter can range from 0 to the maximum limit imposed
by the system.
The following example shows a
typical user-defined msgbuf structure that includes sufficient
space for the largest message:
struct my_msgbuf
mtyp_t mtype;
char mtext[MSGSIZ]; /* MSGSIZ is the size of the largest message */
Note: The routine may coredump instead of returning EFAULT
when an invalid pointer is passed in case of 64-bit application calling 32-bit
kernel interface.
The following system limits apply
to the message queue:
- Maximum message size is 65,535 bytes for releases prior to AIX
4.1.5 and is 4 Megabytes for AIX 4.1.5 and later
releases.
- Maximum number of messages
per queue is 8192.
- Maximum number of message
queue IDs is 4096 for releases before AIX 4.3.2 and 131072 for
AIX 4.3.2 and following.
- Maximum number of bytes in a
queue is 4 65,535 bytes for releases prior to AIX 4.1.5 is 4
Megabytes for AIX 4.1.5 and later releases.
Note: For a 64-bit process, the mtype field is 64
bits long. However, for compatibility with 32-bit processes, the
mtype field must be a 32-bit signed value that is sign-extended to
64 bits. The most significant 32 bits are not put on the message
queue. For a 64-bit process, the mtype field is again
sign-extended to 64 bits.
The MessageFlag
parameter specifies the action to be taken if the message cannot be sent for
one of the following reasons:
- The number of bytes already on
the queue is equal to the number of bytes defined by themsg_qbytes
structure.
- The total number of messages
on the queue is equal to a system-imposed limit.
These actions are as
follows:
- If the MessageFlag
parameter is set to the IPC_NOWAIT value, the message is not sent,
and the msgsnd subroutine returns a value of -1 and sets the
errno global variable to the EAGAIN error code.
- If the MessageFlag
parameter is set to 0, the calling process suspends execution until one of the
following occurs:
- The condition responsible for
the suspension no longer exists, in which case the message is sent.
- The MessageQueueID
parameter is removed from the system. (For information on how to remove
the MessageQueueID parameter, see the msgctl (msgctl Subroutine) subroutine.) When this occurs, the errno
global variable is set equal to the EIDRM error code, and a value
of -1 is returned.
- The calling process receives
a signal that is to be caught. In this case the message is not sent and
the calling process resumes execution in the manner prescribed in the sigaction subroutine.
MessageQueueID
| Specifies the queue to which the message is sent.
|
MessagePointer
| Points to a msgbuf structure containing the message.
|
MessageSize
| Specifies the length, in bytes, of the message text.
|
MessageFlag
| Specifies the action to be taken if the message cannot be sent.
|
Upon successful completion, a
value of 0 is returned and the following actions are taken with respect to the
data structure associated with the MessageQueueID parameter:
- The msg_qnum field
is incremented by 1.
- The msg_lspid field
is set equal to the process ID of the calling process.
- The msg_stime field
is set equal to the current time.
If the msgsnd
subroutine is unsuccessful, a value of -1 is returned and the errno
global variable is set to indicate the error.
The msgsnd subroutine
is unsuccessful and no message is sent if one or more of the following
conditions is true:
EACCES
| The calling process is denied permission for the specified
operation.
|
EAGAIN
| The message cannot be sent for one of the reasons stated previously, and
the MessageFlag parameter is set to the IPC_NOWAIT
value.
|
EFAULT
| The MessagePointer parameter points outside of the address
space of the process.
|
EIDRM
| The message queue identifier specified by the MessageQueueID
parameter has been removed from the system.
|
EINTR
| The msgsnd subroutine received a signal.
|
EINVAL
| The MessageQueueID parameter is not a valid message queue
identifier.
|
EINVAL
| The mtype field is less than 1.
|
EINVAL
| The MessageSize parameter is less than 0 or greater than the
system-imposed limit.
|
EINVAL
| The upper 32-bits of the 64-bit mtype field for a 64-bit process is not
0.
|
ENOMEM
| The message could not be sent because not enough storage space was
available.
|
This subroutine is part of Base
Operating System (BOS) Runtime.
The msgctl (msgctl Subroutine) subroutine, msgget (msgget Subroutine) subroutine, msgrcv (msgrcv Subroutine) subroutine,
msgxrcv (msgxrcv Subroutine) subroutine, sigaction subroutine.
[ Previous | Next | Table of Contents | Index |
Library Home |
Legal |
Search ]