|
Packit |
7cfc04 |
'\" et
|
|
Packit |
7cfc04 |
.TH MQ_NOTIFY "3P" 2013 "IEEE/The Open Group" "POSIX Programmer's Manual"
|
|
Packit |
7cfc04 |
.SH PROLOG
|
|
Packit |
7cfc04 |
This manual page is part of the POSIX Programmer's Manual.
|
|
Packit |
7cfc04 |
The Linux implementation of this interface may differ (consult
|
|
Packit |
7cfc04 |
the corresponding Linux manual page for details of Linux behavior),
|
|
Packit |
7cfc04 |
or the interface may not be implemented on Linux.
|
|
Packit |
7cfc04 |
|
|
Packit |
7cfc04 |
.SH NAME
|
|
Packit |
7cfc04 |
mq_notify
|
|
Packit |
7cfc04 |
\(em notify process that a message is available
|
|
Packit |
7cfc04 |
(\fBREALTIME\fP)
|
|
Packit |
7cfc04 |
.SH SYNOPSIS
|
|
Packit |
7cfc04 |
.LP
|
|
Packit |
7cfc04 |
.nf
|
|
Packit |
7cfc04 |
#include <mqueue.h>
|
|
Packit |
7cfc04 |
.P
|
|
Packit |
7cfc04 |
int mq_notify(mqd_t \fImqdes\fP, const struct sigevent *\fInotification\fP);
|
|
Packit |
7cfc04 |
.fi
|
|
Packit |
7cfc04 |
.SH DESCRIPTION
|
|
Packit |
7cfc04 |
If the argument
|
|
Packit |
7cfc04 |
.IR notification
|
|
Packit |
7cfc04 |
is not NULL, this function shall register the calling process to be
|
|
Packit |
7cfc04 |
notified of message arrival at an empty message queue associated with
|
|
Packit |
7cfc04 |
the specified message queue descriptor,
|
|
Packit |
7cfc04 |
.IR mqdes .
|
|
Packit |
7cfc04 |
The notification specified by the
|
|
Packit |
7cfc04 |
.IR notification
|
|
Packit |
7cfc04 |
argument shall be sent to the process when the message queue transitions
|
|
Packit |
7cfc04 |
from empty to non-empty. At any time, only one process may be
|
|
Packit |
7cfc04 |
registered for notification by a message queue. If the calling process
|
|
Packit |
7cfc04 |
or any other process has already registered for notification of message
|
|
Packit |
7cfc04 |
arrival at the specified message queue, subsequent attempts to register
|
|
Packit |
7cfc04 |
for that message queue shall fail.
|
|
Packit |
7cfc04 |
.P
|
|
Packit |
7cfc04 |
If
|
|
Packit |
7cfc04 |
.IR notification
|
|
Packit |
7cfc04 |
is NULL and the process is currently registered for notification by the
|
|
Packit |
7cfc04 |
specified message queue, the existing registration shall be removed.
|
|
Packit |
7cfc04 |
.P
|
|
Packit |
7cfc04 |
When the notification is sent to the registered process, its
|
|
Packit |
7cfc04 |
registration shall be removed. The message queue shall then be available
|
|
Packit |
7cfc04 |
for registration.
|
|
Packit |
7cfc04 |
.P
|
|
Packit |
7cfc04 |
If a process has registered for notification of message arrival at a
|
|
Packit |
7cfc04 |
message queue and some thread is blocked in
|
|
Packit |
7cfc04 |
\fImq_receive\fR()
|
|
Packit |
7cfc04 |
or
|
|
Packit |
7cfc04 |
\fImq_timedreceive\fR()
|
|
Packit |
7cfc04 |
waiting to receive a message when a message arrives at the queue, the
|
|
Packit |
7cfc04 |
arriving message shall satisfy the appropriate
|
|
Packit |
7cfc04 |
\fImq_receive\fR()
|
|
Packit |
7cfc04 |
or
|
|
Packit |
7cfc04 |
\fImq_timedreceive\fR(),
|
|
Packit |
7cfc04 |
respectively. The resulting behavior is as if the message queue remains
|
|
Packit |
7cfc04 |
empty, and no notification shall be sent.
|
|
Packit |
7cfc04 |
.SH "RETURN VALUE"
|
|
Packit |
7cfc04 |
Upon successful completion, the
|
|
Packit |
7cfc04 |
\fImq_notify\fR()
|
|
Packit |
7cfc04 |
function shall return a value of zero; otherwise, the function shall
|
|
Packit |
7cfc04 |
return a value of \(mi1 and set
|
|
Packit |
7cfc04 |
.IR errno
|
|
Packit |
7cfc04 |
to indicate the error.
|
|
Packit |
7cfc04 |
.SH ERRORS
|
|
Packit |
7cfc04 |
The
|
|
Packit |
7cfc04 |
\fImq_notify\fR()
|
|
Packit |
7cfc04 |
function shall fail if:
|
|
Packit |
7cfc04 |
.TP
|
|
Packit |
7cfc04 |
.BR EBADF
|
|
Packit |
7cfc04 |
The
|
|
Packit |
7cfc04 |
.IR mqdes
|
|
Packit |
7cfc04 |
argument is not a valid message queue descriptor.
|
|
Packit |
7cfc04 |
.TP
|
|
Packit |
7cfc04 |
.BR EBUSY
|
|
Packit |
7cfc04 |
A process is already registered for notification by the message queue.
|
|
Packit |
7cfc04 |
.P
|
|
Packit |
7cfc04 |
The
|
|
Packit |
7cfc04 |
\fImq_notify\fR()
|
|
Packit |
7cfc04 |
function may fail if:
|
|
Packit |
7cfc04 |
.TP
|
|
Packit |
7cfc04 |
.BR EINVAL
|
|
Packit |
7cfc04 |
The
|
|
Packit |
7cfc04 |
.IR notification
|
|
Packit |
7cfc04 |
argument is NULL and the process is currently not registered.
|
|
Packit |
7cfc04 |
.LP
|
|
Packit |
7cfc04 |
.IR "The following sections are informative."
|
|
Packit |
7cfc04 |
.SH EXAMPLES
|
|
Packit |
7cfc04 |
The following program registers a notification request for the message
|
|
Packit |
7cfc04 |
queue named in its command-line argument. Notification is performed
|
|
Packit |
7cfc04 |
by creating a thread. The thread executes a function which reads one
|
|
Packit |
7cfc04 |
message from the queue and then terminates the process.
|
|
Packit |
7cfc04 |
.sp
|
|
Packit |
7cfc04 |
.RS 4
|
|
Packit |
7cfc04 |
.nf
|
|
Packit |
7cfc04 |
\fB
|
|
Packit |
7cfc04 |
#include <pthread.h>
|
|
Packit |
7cfc04 |
#include <mqueue.h>
|
|
Packit |
7cfc04 |
#include <assert.h>
|
|
Packit |
7cfc04 |
#include <stdio.h>
|
|
Packit |
7cfc04 |
#include <stdlib.h>
|
|
Packit |
7cfc04 |
#include <unistd.h>
|
|
Packit |
7cfc04 |
.P
|
|
Packit |
7cfc04 |
static void /* Thread start function */
|
|
Packit |
7cfc04 |
tfunc(union sigval sv)
|
|
Packit |
7cfc04 |
{
|
|
Packit |
7cfc04 |
struct mq_attr attr;
|
|
Packit |
7cfc04 |
ssize_t nr;
|
|
Packit |
7cfc04 |
void *buf;
|
|
Packit |
7cfc04 |
mqd_t mqdes = *((mqd_t *) sv.sival_ptr);
|
|
Packit |
7cfc04 |
.P
|
|
Packit |
7cfc04 |
/* Determine maximum msg size; allocate buffer to receive msg */
|
|
Packit |
7cfc04 |
.P
|
|
Packit |
7cfc04 |
if (mq_getattr(mqdes, &attr) == -1) {
|
|
Packit |
7cfc04 |
perror("mq_getattr");
|
|
Packit |
7cfc04 |
exit(EXIT_FAILURE);
|
|
Packit |
7cfc04 |
}
|
|
Packit |
7cfc04 |
buf = malloc(attr.mq_msgsize);
|
|
Packit |
7cfc04 |
.P
|
|
Packit |
7cfc04 |
if (buf == NULL) {
|
|
Packit |
7cfc04 |
perror("malloc");
|
|
Packit |
7cfc04 |
exit(EXIT_FAILURE);
|
|
Packit |
7cfc04 |
}
|
|
Packit |
7cfc04 |
.P
|
|
Packit |
7cfc04 |
nr = mq_receive(mqdes, buf, attr.mq_msgsize, NULL);
|
|
Packit |
7cfc04 |
if (nr == -1) {
|
|
Packit |
7cfc04 |
perror("mq_receive");
|
|
Packit |
7cfc04 |
exit(EXIT_FAILURE);
|
|
Packit |
7cfc04 |
}
|
|
Packit |
7cfc04 |
.P
|
|
Packit |
7cfc04 |
printf("Read %ld bytes from message queue\en", (long) nr);
|
|
Packit |
7cfc04 |
free(buf);
|
|
Packit |
7cfc04 |
exit(EXIT_SUCCESS); /* Terminate the process */
|
|
Packit |
7cfc04 |
}
|
|
Packit |
7cfc04 |
.P
|
|
Packit |
7cfc04 |
int
|
|
Packit |
7cfc04 |
main(int argc, char *argv[])
|
|
Packit |
7cfc04 |
{
|
|
Packit |
7cfc04 |
mqd_t mqdes;
|
|
Packit |
7cfc04 |
struct sigevent not;
|
|
Packit |
7cfc04 |
.P
|
|
Packit |
7cfc04 |
assert(argc == 2);
|
|
Packit |
7cfc04 |
.P
|
|
Packit |
7cfc04 |
mqdes = mq_open(argv[1], O_RDONLY);
|
|
Packit |
7cfc04 |
if (mqdes == (mqd_t) -1) {
|
|
Packit |
7cfc04 |
perror("mq_open");
|
|
Packit |
7cfc04 |
exit(EXIT_FAILURE);
|
|
Packit |
7cfc04 |
}
|
|
Packit |
7cfc04 |
.P
|
|
Packit |
7cfc04 |
not.sigev_notify = SIGEV_THREAD;
|
|
Packit |
7cfc04 |
not.sigev_notify_function = tfunc;
|
|
Packit |
7cfc04 |
not.sigev_notify_attributes = NULL;
|
|
Packit |
7cfc04 |
not.sigev_value.sival_ptr = &mqdes; /* Arg. to thread func. */
|
|
Packit |
7cfc04 |
if (mq_notify(mqdes, ¬) == -1) {
|
|
Packit |
7cfc04 |
perror("mq_notify");
|
|
Packit |
7cfc04 |
exit(EXIT_FAILURE);
|
|
Packit |
7cfc04 |
}
|
|
Packit |
7cfc04 |
.P
|
|
Packit |
7cfc04 |
pause(); /* Process will be terminated by thread function */
|
|
Packit |
7cfc04 |
}
|
|
Packit |
7cfc04 |
.fi \fR
|
|
Packit |
7cfc04 |
.P
|
|
Packit |
7cfc04 |
.RE
|
|
Packit |
7cfc04 |
.SH "APPLICATION USAGE"
|
|
Packit |
7cfc04 |
None.
|
|
Packit |
7cfc04 |
.SH RATIONALE
|
|
Packit |
7cfc04 |
None.
|
|
Packit |
7cfc04 |
.SH "FUTURE DIRECTIONS"
|
|
Packit |
7cfc04 |
None.
|
|
Packit |
7cfc04 |
.SH "SEE ALSO"
|
|
Packit |
7cfc04 |
.IR "\fImq_open\fR\^(\|)",
|
|
Packit |
7cfc04 |
.IR "\fImq_send\fR\^(\|)",
|
|
Packit |
7cfc04 |
.IR "\fImq_receive\fR\^(\|)",
|
|
Packit |
7cfc04 |
.IR "\fImsgctl\fR\^(\|)",
|
|
Packit |
7cfc04 |
.IR "\fImsgget\fR\^(\|)",
|
|
Packit |
7cfc04 |
.IR "\fImsgrcv\fR\^(\|)",
|
|
Packit |
7cfc04 |
.IR "\fImsgsnd\fR\^(\|)"
|
|
Packit |
7cfc04 |
.P
|
|
Packit |
7cfc04 |
The Base Definitions volume of POSIX.1\(hy2008,
|
|
Packit |
7cfc04 |
.IR "\fB<mqueue.h>\fP"
|
|
Packit |
7cfc04 |
.SH COPYRIGHT
|
|
Packit |
7cfc04 |
Portions of this text are reprinted and reproduced in electronic form
|
|
Packit |
7cfc04 |
from IEEE Std 1003.1, 2013 Edition, Standard for Information Technology
|
|
Packit |
7cfc04 |
-- Portable Operating System Interface (POSIX), The Open Group Base
|
|
Packit |
7cfc04 |
Specifications Issue 7, Copyright (C) 2013 by the Institute of
|
|
Packit |
7cfc04 |
Electrical and Electronics Engineers, Inc and The Open Group.
|
|
Packit |
7cfc04 |
(This is POSIX.1-2008 with the 2013 Technical Corrigendum 1 applied.) In the
|
|
Packit |
7cfc04 |
event of any discrepancy between this version and the original IEEE and
|
|
Packit |
7cfc04 |
The Open Group Standard, the original IEEE and The Open Group Standard
|
|
Packit |
7cfc04 |
is the referee document. The original Standard can be obtained online at
|
|
Packit |
7cfc04 |
http://www.unix.org/online.html .
|
|
Packit |
7cfc04 |
|
|
Packit |
7cfc04 |
Any typographical or formatting errors that appear
|
|
Packit |
7cfc04 |
in this page are most likely
|
|
Packit |
7cfc04 |
to have been introduced during the conversion of the source files to
|
|
Packit |
7cfc04 |
man page format. To report such errors, see
|
|
Packit |
7cfc04 |
https://www.kernel.org/doc/man-pages/reporting_bugs.html .
|