Msgget(2) returns 0 - a workaround fix


 
Thread Tools Search this Thread
Top Forums Programming Msgget(2) returns 0 - a workaround fix
# 8  
Old 06-24-2014
Quote:
Originally Posted by mr_bandit
To be honest, I did not look at errno after msgget() returned 0 (It was in the wee early hours and I had bigger fish..). I will try that and get back with the results. This will also tell me if the original key returns 0.

The interesting thing is we loaded a *way* earlier version of the code to test a completely different thing. I jut did a ipcs and got

Code:
------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages
0x000000f0 0          gfi        666        0            0

where you can see msgqid == 0 and the system seems to be performing happily (at least this part of it). This would seem to enforce the observation / theory that once the msgqid becomes 0, it stays 0. No complaints from msgsnd() or msgrcv().

So - this may be a brainfart on my part. After all, I did have another bug throwing a SIGSEGV at the same time. And it was very late/early. If it is a brainfart, my apologies.

Again, this an unpatched Ubuntu 8

@achenlehas an interesting suggestion. I had not thought of setting errno to a value before making the call. The question then becomes: why not set it to (-1)? errno values are positive, at least on Linux. (I seem to remember them being negative numbers on BSD 4.1, but that was a *long* time ago...)
All of the code in the links this thread have pointed to wrote error messages if msgget() returned a value <= 0 even though an error is indicated only if the return value is strictly less than 0.

Nothing was shown indicating that there was any error from msgrcv() or msgsnd() in cases where msgget() returned 0.

Unless the man page explicitly states otherwise, the value of errno after a call to a function that completes successfully is meaningless. On function calls where the value returned to indicate an error can also be returned in a successful completion case, you'll usually see something like:
Quote:
This function shall not change the setting of errno if successful.

Since some value is returned on error and is also a valid return on
success, an application wishing to check for error situations should
set errno to 0, then call function(), then check errno.
There is no statement like this on the msgget() page because the value returned when msgget() fails (-1) is never returned if msgget() succeeds.
This User Gave Thanks to Don Cragun For This Post:
# 9  
Old 06-24-2014
Less forcefully than Don steated it, but I think is idea of success return code is the entire problem here, plus using msgid as a message and NOT as message queue id. Which it is. They are not the same thing. Period.

Last edited by jim mcnamara; 06-24-2014 at 11:43 PM..
# 10  
Old 06-25-2014
Quote:
using msgid as a message and NOT as message queue id. Which it is. They are not the same thing. Period.
I do not understand why you make this statement, I have consistently used msgget() to get the ID of the queue, never as a message itself. the msgq_id is a parameter to msgsnd() and msgrcv() to specify the queue for the message.

Now, my confusion was over a msgq_id == 0 as a valid number. It is, in both practice and theory.

@Don is absolutely correct stating

Quote:
Unless the man page explicitly states otherwise, the value of errno after a call to a function that completes successfully is meaningless.
Again, my confusion was that what seemed to be a successful return from msgget() (according to the man page), but not having success. I actually had two bugs that were subtle and misleading, but that is the life of a programmer. (Especially when dealing with *really* bad code.) My searches for information found scant help. The collected wisdom of the community have helped me many times (Thanks, Google!) in finding the obscure information on forums. (If one programs Atmel chips, I recommend avrfreaks.net.)

AND - my purpose in this post was to try to help provide some more information to the next person who had this issue at 3am. The helpful replies have added to that goal, and I thank the posters for their time and attention.
# 11  
Old 06-27-2014
Quote:
Originally Posted by jim mcnamara
Less forcefully than Don steated it, but I think is idea of success return code is the entire problem here, plus using msgid as a message and NOT as message queue id. Which it is. They are not the same thing. Period.
I am not trying to flame, but *please* point out *one* place I used msgq_id as a message. You keep saying the same thing but will not give one example of where I did so.

In the meantime, I am going to see my family for a week, so I will check for a reply when I get back.
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. AIX

AIO workaround AIX 5.3 to AIX 7.1

Hello Folks, Facing a problem starting Apache Services on AIX 7.1 This is the error i'm getting /oraapp/prodora/iAS/Apache/Apache/bin/apachectl start: httpd started Syntax error on line 17 of /oraapp/prodora/iAS/Apache/modplsql/cfg/plsql_pls.conf: Cannot load... (0 Replies)
Discussion started by: filosophizer
0 Replies

2. UNIX for Advanced & Expert Users

stuck in CLOSE_WAIT Solaris 10 - Patch and workaround

Solaris 10 Sparc: When you got a connection locking a tcp/port, and the status is CLOSE_WAIT (for ever :wall:), you just use the tcpdrop, to close the connection. This is a OS bug. I wrote the bug id bellow: BUG-ID 6468753 connections stuck in CLOSE_WAIT The patch that's correct the bug:... (0 Replies)
Discussion started by: thiagofborn
0 Replies

3. Programming

msgget message queue always get permission denied

I want to use msgget() to obtain a message queue between two processes, here is my code: the first one create the mq, the second one open it and add a message to it. But when I execute the second one, I get permission denied. I've already desperately tried everything I can think of to solve this... (2 Replies)
Discussion started by: tefino
2 Replies

4. Shell Programming and Scripting

Calculation returns no value

#/bin/sh ..... #convert memory to MB let "mmsize_a= ($mmsize)/256" let "mminuse_a= ($mminuse)/256" let "mmfree_a= ($mmsize_a -$mminuse_a)" let "mmfreepercent= (($mmfree_a)/($mmsize_a))*100" # #format output echo "\n\n######################" >>$sndFile echo "\n$sysName Total Memory usage"... (3 Replies)
Discussion started by: Daniel Gate
3 Replies

5. Windows & DOS: Issues & Discussions

Samba trouble shoot / workaround ?

Hello, I've setup a ubuntu 10.04 server running samba 3.4.7 as domain controler / file server at a customer site, that works great most of the time but I face a random problem. Of course I'm never on the site when the problem occurs, so I cannot investigate in real time. What happens is that... (2 Replies)
Discussion started by: Manu.b
2 Replies

6. UNIX for Dummies Questions & Answers

Workaround for macros in sftp command

Hi, I've some existing scripts wherein am using ftp + .netrc. I've defined my macros in .netrc file. I want to switch to sftp now but it seems it doesn't support macros and .netrc and it gives "command invalid" error. Is there any other alternative? Note: I don't want help for... (1 Reply)
Discussion started by: ps51517
1 Replies

7. Programming

Problem with msgget()

Hi, I am having problem with msgget() function. Here is the problem that I am having on Unix : I have two processes sender and receiver. Sender generates queue (msgget()) with some key e.g. 938, for output. Receiver reads from the same queue. i.e. receiver also tries to get queue... (2 Replies)
Discussion started by: Ashwini
2 Replies

8. Shell Programming and Scripting

find & sed -i work fine. Now need -i workaround for old OS.

I have a script that does a search and replace on a tree using find, xargs and sed that looks something like this. find . -type f -print0 | xargs -0 sed -i 's/fromthis/tothis/g' Now this works fine on new versions on Linux but I need to make the script work on an old RAQ550 that has an older... (3 Replies)
Discussion started by: simonb
3 Replies

9. Programming

about msgget troble

hi,all i have in trouble about msgget. i create a queue and the program like blow: openMsg( pid_t key ) { .... int msgid; .... msgid=msgget(key,IPC_CREAT|IPC_EXCL|0666) if( msgid<=0 ){ fprintf( stdout,"%s,%d",strerror(errno),errno ); return -1; ... (9 Replies)
Discussion started by: subrain
9 Replies
Login or Register to Ask a Question