creating a message queue using mq_open


 
Thread Tools Search this Thread
Top Forums Programming creating a message queue using mq_open
# 1  
Old 11-10-2010
Bug creating a message queue using mq_open

Hi all,
First of all thanks in advance for reading my post and for your heart for helping me.

I am trying to create a message queue using mq_open(name,oflags,mode_t,attr) method. But that function call is returning with an error code EFAULT. By googling it I found that it happens when there is an invalid memory address reference and in another forum it is said that it is because of "internal virtual memory error". Can anybody please help me to get out of this error. Any efforts will be very much appreciated. I am really stuck with that..
Once again thanking you all and waiting for a reply,
regards,
paru.
# 2  
Old 11-10-2010
Either name or attr points to an address outside the current process memory space. Please check that name correctly points to the correct string, resp. attr to a correct mq_attr structure.

Eventually, post how you're calling mq_open()

HTH,
Loïc
# 3  
Old 11-11-2010
Hi Loic,
Thanks for your help. i am calling the method as below
Code:
mq_open( "/iothreadNewTest", oflags,(S_IRUSR | S_IWUSR),NULL)

So in this case can it be because of that?

Last edited by Scott; 11-15-2010 at 02:51 AM.. Reason: Code tags
# 4  
Old 11-11-2010
Yeah, now I understand your problem. How do you check that the error returned by mq_open() ? On which OS do you see this problem?
# 5  
Old 11-11-2010
Quote:
mq_open( "/iothreadNewTest", oflags,(S_IRUSR | S_IWUSR),NULL)
What value are you using for oflags? If this is the first time you are connecting to this queue, you need to pass O_CREAT to tell mq_open to create the queue.

Here is a link to very good documentation on all the mq_ functions (and other POSIX functions), that I found very helpful while implementing a message-queue based solution:
Alphabetical Index - M
# 6  
Old 11-12-2010
Quote:
Originally Posted by Loic Domaigne
Yeah, now I understand your problem. How do you check that the error returned by mq_open() ? On which OS do you see this problem?
Thank you for time,
I am giving below the code snippet which i use.
Code:
oflags = 0;
  oflags |= (Flags & MQ_READ)?(O_RDONLY):(0);
  oflags |= (Flags & MQ_WRITE)?(O_WRONLY):(0);
  oflags |= (Flags & MQ_READ_WRITE)?(O_RDWR):(0);
  oflags |= (Flags & MQ_NON_BLOCKING)?(O_NONBLOCK):(0);
  oflags |= (O_CREAT | O_EXCL); // try to create it first
  mqAttr.mq_maxmsg = maxMsg;
  mqAttr.mq_msgsize = msgSz + sizeof(MSG_Q_HEADER);
  
  if ((fileDesc = mq_open( "/iothreadNewTest435", oflags,(S_IRUSR | S_IWUSR),NULL)) == -1 )
  {
    rc = mqEvalErrnoOpen(pName))

}

mqEvalErrnoOpen( const char * pName )
{
 MQ_RC rc;
 int err = 0;

  switch ( errno )
  {
  case EACCES:
    rc = MQ_INVALID_ACCESS;
    break;

  case EEXIST:
    rc = MQ_ALREADY_EXISTS;
    break;

  case EFAULT:
    rc = MQ_INVALID_ADDRESS;
    break;

  case EINVAL:
    rc = MQ_INVALID_ACCESS;
    break;

  case EMFILE:
    rc = MQ_TOO_MANY_MSG_Q_DESC;
    break;

  case ENAMETOOLONG:
    rc = MQ_NAME_TOO_LONG;
    break;

  case ENFILE:
    rc = MQ_TOO_MANY_MSG_Q_DESC;
    break;

  case ENOENT:
    rc = MQ_QUEUE_NOT_PRESENT;
    break;

  case ENOMEM:
    rc = MQ_INSUFFICIENT_MEMORY;
    break;

  case ENOSPC:
    rc = MQ_INSUFFICIENT_MEMORY;
    break;

  case ENOTSUP:
    rc = MQ_NOT_SUPPORTED_CHECKPOINT_RESTART_PROC;
    break;

  default:
    rc = MQ_ERRNO;
    err = errno;
    break;
  }

Here rc is returning a value MQ_INVALID Address.
My os details are as follows Fedora Sulphur
Code:
Linux myMachine 2.6.25-14.fc9.i686 #1 SMP Thu May 1 06:28:41 EDT 2008 i686 i686 i386 GNU/Linux

Please help me with this,
Thanks again,
Paru.

Last edited by Scott; 11-15-2010 at 02:52 AM.. Reason: Code tags
# 7  
Old 11-12-2010
I see that you are filling the mqAttr structure, but not passing it to mq_open... it should not cause the error, but just noticed it.

Also, you are passing both O_EXCL and O_CREAT to mq_open... as per the opengroup documentation:

Quote:
mq_open
If O_EXCL and O_CREAT are set, mq_open() shall fail if the message queue name exists.
I do not see an EFAULT listed as a possible errno in the documentation, so its probably some sort of extension that your OS has implemented.
- What OS are you using?
- Try looking at the documentation for mq_open for your OS. It should detail what conditions cause the EFAULT error.
- Also, did you try running the code with a different queue name? do you get the same error every time?
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

POSIX message queue mq_open directory

hello, I try to test the POSIX mq_open function on book unp like below: #include "unpipc.h" # include <mqueue.h> int main(int argc, char **argv) { int c, flags; mqd_t mqd; flags = O_RDWR | O_CREAT; while ((c = getopt(argc, argv, "e")) != -1) { ... (3 Replies)
Discussion started by: anpufeng
3 Replies

2. Programming

Permission denied when creating message queue

Hi guys. i have wrote a simple program to test message queue attributes. here it is: #include <stdio.h> #include <stdlib.h> #include <mqueue.h> #include <fcntl.h> #include <string.h> #include <errno.h> #include <sys/stat.h> int main() { struct mq_attr attr; mqd_t mqd; ... (2 Replies)
Discussion started by: majid.merkava
2 Replies

3. Ubuntu

Message Queue in Linux

Hello How can I see the created message queues in the system? (4 Replies)
Discussion started by: xyzt
4 Replies

4. Programming

UNIX Message Queue

Hello !!!!! I have a simple question but i can't find the answer anywhere hope to meet it here. Why it is a bad idea to pass pointers through message queues ? Most structs i see all of their char types are arrays... Is it becase having pointers means we could possibily send wrong bytes ? For... (2 Replies)
Discussion started by: qlyine
2 Replies

5. Programming

How to limit max no of message in a posix message queue

Hii can anyone pls tell how to limit the max no of message in a posix message queue. I have made changes in proc/sys/fs/mqueue/msg_max But still whenever i try to read the value of max. message in the queue using attr.mq_curmsgs (where struct mq_attr attr) its giving the default value as 10.... (0 Replies)
Discussion started by: mohit3884
0 Replies

6. Programming

URGENT:::Can anybody help me in creating message queue appliction??

hello, I had to implement a message queue application....between 30 processes...... all 30 proceses are getting data from serial port.... And here is THE FLOW::::::::1 connector process...which is linked with message queue to all the 30 applications. Processes get the data from serial port and... (9 Replies)
Discussion started by: arunchaudhary19
9 Replies

7. Programming

message queue

Hello, i need to write a message queue "chat server", that should work only localy. Can anyone please help me with some ideas and peshaps code. I'm studying the UNIX IPC mechanisms right now. So far, i understand how it works but i still cannot get an idea how to write a chat programm... ... (2 Replies)
Discussion started by: etenv
2 Replies

8. Programming

Message Queue with fork() help

hi all... ive been trying this program where i spawn 4 threads... and i am trying to use message queue to send msgs from 3 of the threads to the parent thread... but it doent seem to be working... ive almost pulled out my hair tryin to fix the prob :confused: another wierd thing... (1 Reply)
Discussion started by: strider
1 Replies

9. HP-UX

error mq_open message queue

Hello, J work on a HP. I want to create message queue by using mq_open with this parameters: mq_open(p,O_CREAT|O_WRONLY|O_EXCL|0_NONBLOCK,0600,&queue_attr) with p char and the function returns the value -1 and errno equal 2. can you help me ? Thank. (3 Replies)
Discussion started by: AUBERT
3 Replies

10. UNIX for Advanced & Expert Users

Unix message Queue

Hi, I am working closly with unix message queues i have encountered the following - after creating the Q and start working with it (pushing & pulling) i receive the following stange parameters on the q's - STIME=no_entry Qnum=0 CBYTES=4140 when this happens, the Q is disabled (meaning i... (3 Replies)
Discussion started by: kel
3 Replies
Login or Register to Ask a Question