If the argument notification is not
NULL,
this system call will register the calling process to be notified of message
arrival at an empty message queue associated with the specified message
queue descriptor,
mqdes.
The notification specified by the
notification
argument will be sent to
the process when the message queue transitions from empty to non-empty.
At any time, only one process may be registered for notification by a
message queue.
If the calling process or any other process has already
registered for notification of message arrival at the specified message
queue, subsequent attempts to register for that message queue will fail.
The
notification
argument points to a
sigevent
structure that defines how the calling process will be notified.
If
notification->sigev_notify
is
SIGEV_NONE,
then no signal will be posted, but the error status and the return status
for the operation will be set appropriately.
For
SIGEV_SIGNO
and
SIGEV_THREAD_ID
notifications,
the signal specified in
notification->sigev_signo
will be sent to the calling process
( SIGEV_SIGNO)
or to the thread whose LWP ID is
notification->sigev_notify_thread_id
( SIGEV_THREAD_ID).
The information for the queued signal will include:
Member | Value |
si_code | SI_MESGQ |
si_value | the value stored in
notification->sigev_value
|
si_mqd | mqdes |
If
notification
is
NULL
and the process is currently registered for notification by the specified
message queue, the existing registration will be removed.
When the notification is sent to the registered process, its registration
is removed.
The message queue then is available for registration.
If a process has registered for notification of message arrival at a
message queue and some thread is blocked in
mq_receive()
waiting to receive a message when a message arrives at the queue, the
arriving message will satisfy the appropriate
mq_receive().
The resulting behavior is as if the message queue remains empty, and no
notification will be sent.