sbzainal
asked on
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
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
can you please include the definition of my_msgbuf?
>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).
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).
ASKER
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.
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.
>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
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
ASKER
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
Thx
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.