table of contents
other versions
- jessie 3.74-1
- jessie-backports 4.10-2~bpo8+1
- stretch 4.10-2
- testing 4.16-1
- stretch-backports 4.16-1~bpo9+1
- unstable 4.16-1
other sections
MQ_NOTIFY(3) | Linux Programmer's Manual | MQ_NOTIFY(3) |
NAME¶
mq_notify - register for notification when a message is availableSYNOPSIS¶
#include <mqueue.h> int mq_notify(mqd_t mqdes, const struct sigevent *sevp);Link with -lrt.
DESCRIPTION¶
mq_notify() allows the calling process to register or unregister for delivery of an asynchronous notification when a new message arrives on the empty message queue referred to by the descriptor mqdes. The sevp argument is a pointer to a sigevent structure. For the definition and general details of this structure, see sigevent(7). If sevp is a non-null pointer, then mq_notify() registers the calling process to receive message notification. The sigev_notify field of the sigevent structure to which sevp points specifies how notification is to be performed. This field has one of the following values:- SIGEV_NONE
- A "null" notification: the calling process is registered as the target for notification, but when a message arrives, no notification is sent.
- SIGEV_SIGNAL
- Notify the process by sending the signal specified in sigev_signo. See sigevent(7) for general details. The si_code field of the siginfo_t structure will be set to SI_MESGQ. In addition, si_pid will be set to the PID of the process that sent the message, and si_uid will be set to the real user ID of the sending process.
- SIGEV_THREAD
- Upon message delivery, invoke sigev_notify_function as if it were the start function of a new thread. See sigevent(7) for details.
RETURN VALUE¶
On success mq_notify() returns 0; on error, -1 is returned, with errno set to indicate the error.ERRORS¶
- EBADF
- The descriptor specified in mqdes is invalid.
- EBUSY
- Another process has already registered to receive notification for this message queue.
- EINVAL
- sevp->sigev_notify is not one of the permitted values; or sevp->sigev_notify is SIGEV_SIGNAL and sevp->sigev_signo is not a valid signal number.
- ENOMEM
- Insufficient memory.
CONFORMING TO¶
POSIX.1-2001.EXAMPLE¶
The following program registers a notification request for the message queue named in its command-line argument. Notification is performed by creating a thread. The thread executes a function which reads one message from the queue and then terminates the process.Program source¶
#include <pthread.h> #include <mqueue.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) static void /* Thread start function */ tfunc(union sigval sv) { struct mq_attr attr; ssize_t nr; void *buf; mqd_t mqdes = *((mqd_t *) sv.sival_ptr); /* Determine max. msg size; allocate buffer to receive msg */ if (mq_getattr(mqdes, &attr) == -1) handle_error("mq_getattr"); buf = malloc(attr.mq_msgsize); if (buf == NULL) handle_error("malloc"); nr = mq_receive(mqdes, buf, attr.mq_msgsize, NULL); if (nr == -1) handle_error("mq_receive"); printf("Read %zd bytes from MQ\n", nr); free(buf); exit(EXIT_SUCCESS); /* Terminate the process */ } int main(int argc, char *argv[]) { mqd_t mqdes; struct sigevent sev; if (argc != 2) { fprintf(stderr, "Usage: %s <mq-name>\n", argv[0]); exit(EXIT_FAILURE); } mqdes = mq_open(argv[1], O_RDONLY); if (mqdes == (mqd_t) -1) handle_error("mq_open"); sev.sigev_notify = SIGEV_THREAD; sev.sigev_notify_function = tfunc; sev.sigev_notify_attributes = NULL; sev.sigev_value.sival_ptr = &mqdes; /* Arg. to thread func. */ if (mq_notify(mqdes, &sev) == -1) handle_error("mq_notify"); pause(); /* Process will be terminated by thread function */ }
SEE ALSO¶
mq_close(3), mq_getattr(3), mq_open(3), mq_receive(3), mq_send(3), mq_unlink(3), mq_overview(7), sigevent(7)COLOPHON¶
This page is part of release 3.74 of the Linux man-pages project. A description of the project, information about reporting bugs, and the latest version of this page, can be found at http://www.kernel.org/doc/man-pages/.2014-04-06 | Linux |