Showing posts with label GNU. Show all posts
Showing posts with label GNU. Show all posts

POSIX Message Queue


Posix message queue is way to communicate data between process.
This could use for producer-consumer kind of algorithm.

whenever use this code in daemon, use syslog and strerror(errno) function instead of perror.

Compiling and linking


Header file
#include <mqueue.h> library -lrt use for linking
open a message queue with name.

bool open_queue(mqd_t& mqid,const string& queue_name,unsigned int maxqueue,unsigned int msgsize) {
// First we need to set up the attribute structure
struct mq_attr attr; attr.mq_maxmsg =maxqueue; attr.mq_msgsize = msgsize; attr.mq_flags = 0;
// Open a queue with the attribute structure
mqid = mq_open (queue_name.c_str(), O_RDWR | O_CREAT | O_NONBLOCK,  0666, &attr); if(mqid==(mqd_t)-1){ perror("Error:mq_open: ");  // use syslog and strerror(errno) for daemon return false; } return true; }

closing a message

inline void close_queue(mqd_t& mqid) { mq_close(mqid); }

Send or write message to queue

void send_message(mqd_t& mqid, const std::string& str_msg,unsigned int priority) { if (mq_send (mqid, str_msg.c_str(), str_msg.length(), priority) == -1) perror ("Error:mq_send: ");
// use syslog and strerror(errno) for daemon
}

Get count of message available in queue.

int get_message_count(mqd_t& mqid) { int ret=0 struct mq_attr attr; if(mq_getattr (mqid, &attr)==0){ ret= attr.mq_curmsgs; } else perror("Error:mq_getattr: "); return ret; }

Get the max size of messages.

int get_message_size(mqd_t& mqid) { int ret=0; struct mq_attr attr; if(mq_getattr (mqid, &attr)==0){ ret= attr.mq_msgsize; } else perror("Error:mq_getattr: "); return ret; }

Get a message from message queue.

bool get_message(mqd_t& mqid,const std::string& str_msg) { bool ret=false; int msgsize = get_message_size(mqid); if(msgsize && get_message_count(mqid)){ char* buf= new buf[msgsize+1]; memset(buf,0,msgsize+1); if(mq_receive (mqid, buf, msgsize, &prio) != -1){ str_msg=std::string(buf); ret=true; } delete[] buf; } return ret; }