In this chapter we shall learn about:
1. Introduction
2. API’s used in POSIX Message Queue
3. Example for POSIX Message Queue
Introduction:
In the previous chapter we learned about System V message queue. In this chapter we shall learn about POSIX message queue
You should include below header to use Message Queue:
#include <mqueue.h>
Below are the API for using Message Queue:
1. mq_open()
mqd_t mq_open( const char *name, int oflag, … )
It will open a message queue with the “name” and returns a message-queue descriptor.
2. mq_close()
int mq_close( mqd_t mqdes );
It will close the association between the message queue descriptor and a message queue.
3. mq_send()
int mq_send( mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned int msg_prio );
It is used to send a message pointed by “msg_ptr” with the length “msg_len” into the message queue.
You can also assign the priority by filling “msg_prio”.
4. mq_receive()
int mq_receive( mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned int *msg_prio );
It is sued to receive a message from message queue,
5. mq_setattr()
int mq_setattr( mqd_t mqdes, const struct mq_attr *mqstat, struct mq_attr *omqstat );
It is used to set mq_flags of the structure mqstat.
6. mq_getattr()
int mq_getattr( mqd_t mqdes, struct mq_attr *mqstat );
It is used to get the attributes of the queue referenced by the message queue descriptor mqdes.
7. mq_notify()
int mq_notify( mqd_t mqdes, const struct sigevent *notification );
It will notify the calling process when the queue becomes non empty.
8. mq_unlink()
int mq_unlink( const char *name );
It is used to delete a message queue
Example of message queue:
#include <stdio.h> #include <stdlib.h> #include <mqueue.h> #define MAX_MSG_SIZE 4096 #define MAX_MSGS 2 int main( void ) { //create and send a message queue mqd_t mqdSend = mq_open ("/OpenCSF_MQ", O_CREAT | O_EXCL | O_WRONLY, 0600, NULL); mq_send (mqdSend, "HELLO", 6, 10); mq_close (mqdSend); //open a message queue for reading mqd_t mqd = mq_open ("/OpenCSF_MQ", O_RDONLY); struct mq_attr attr; char *buffer = calloc (attr.mq_msgsize, 1); //retrieve the message from message queue int priority = 0; if ((mq_receive (mqd, buffer, attr.mq_msgsize, &priority)) == -1) printf ("Failed to receive message\n"); else printf ("Received [priority %u]: '%s'\n", priority, buffer); //cleanup free (buffer); buffer = NULL; mq_close (mqd); }