• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2392
  • Last Modified:

Problem with msgsnd (writing to message queue)

Hi Experts,

I have a program which reads from an Oracle cursor and after formatting the record, writes to a message queue using the function listed below:

int  WriteMsgQueue(my_msgbuf sBuf)
{
   int rc;
   int buf_length;
   sBuf.mtype = 1;
   buf_length = sizeof(sBuf.mtext);
  /* read from the buffer and write to the message queue */

   /* read from the buffer and write to the message queue */
   rc=(msgsnd(msqid, &sBuf, buf_length, IPC_NOWAIT));

   if (rc == -1)
      perror("msgsnd");
/*  }   */
  return(rc);

My problem is that after successfully sending the first record, I encountered the error message

   "msgsnd :  Invalid parameter"

for each of the next records before the program bombs out.

Please help......

Rgds,
samsul
0
sbzainal
Asked:
sbzainal
  • 3
  • 2
1 Solution
 
brettmjohnsonCommented:
can you please include the definition of my_msgbuf?
0
 
sunnycoderCommented:
>sBuf.mtype = 1;
I think this value is used for message identification and should be unique for each message and should be in range of 0<mtype<MSGMAX

msgsnd specifically points out this error ... extracts from man page -->>>

The mtype field must have a strictly positive integer value that can be used by the receiving process for message selection (see the section about msgrcv).

EINVAL
Invalid msqid value, or nonpositive mtype value, or invalid msgsz value (less than 0 or greater than the system value MSGMAX).

0
 
sbzainalAuthor Commented:
Actually, the error reads as "msgsnd: Invalid identifier", my apologies..!! But since I run the program in debug mode and I found that the receiving program reads one record and wait for another process before continuing with reading my message queue (while at same time my program is writing to the queue - making it full, I guess). When I replace the NOWAIT option with zero, my program did not bomb but instead it waits.  Any comments ??

FYi, my program is a client, the receiving program is the middle-guy with a server at the end.

The other program uses the following function to read my queue :

bool hReadMsgQ()
{
 // Read data from MsgQ
 nMsgQBuffLen = msgrcv(nInMsgQNum, &msgQBuff, BUFF_SIZE, 1, 1);

 // No data from MsgQ
 if (nMsgQBuffLen < 0)
   return false;

 // There is data from MsgQ
 return true;

I'm very new to these IP stuff, so please help...!!

Rgds.
0
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
sunnycoderCommented:
>When I replace the NOWAIT option with zero, my program did not bomb but instead it waits.  Any comments ??
Are you aure that your error message is Invalid Identifier and not EAGAIN ?
Print the error number and error message using perror and post it here
0
 
sbzainalAuthor Commented:
I was running the program on an HP system running HPUX 11....the error was EINVAL rather than EAGAIN. I subsequently ran the program and got this error "msgsnd: Resources temporarily unavailable" - I seriously think its got somthing to do with the kernel resources for message queues being exhausted.  How do I get the information on kernel message queue limits (the system administrator is either not a friendly person or an uncooperative one) i.e. which commands shall I use ???

Thx
0
 
sunnycoderCommented:
Are you freeing the message queue when you are finished using it? ulimit command is used to check the resource limits
I have provided explanation for both the error messages, try getting rid of IPC_NOWAIT and using a different identifier and report back the results
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now