PHWinfo banniere

Titres
PORTAIL ANNUAIRE ARTICLES COMPARATEUR HÉBERGEURS DEVIS FORUMS RÉDUCTEUR D'URL
Précédent   PHWinfo > Autres forums > Forum Programmation & Conception > comp.lang.c > Problem with message queues / msgrcv
S'inscrire FAQ Membres Recherche Messages du jour Marquer les forums comme lus
Problem with message queues / msgrcv

Réponse
 
LinkBack Outils de la discussion
Vieux 27/05/2008, 11h59   #1
bernd
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Problem with message queues / msgrcv

Hi netties,

posted this in a different group already, which seems to be
inappropriate.

I create a message queue with msgget(), sent a 5-byte message to it
with msgsnd() and try to receive the queue's content with msgrcv().
Everything seems to work fine, apart from the fact that I get back
only the last byte back from the original message (after sending the
message ipcs -qA shows clearly that there are 5 Bytes waiting in the
queue).


I am running Solaris 10 8/07 with gcc 3.4.3 as the compiler.


As being not such an experienced C-programmer it could be possible
hat
I am something doing wrong when fiddling around with structures,
pointers etc., but I cannot find it.


The source code (see below) was compiled in the following way:


gcc -fpic msgqueue_tst.c -o mgsqueue_tst


The output is:


Hi there, here is msgget!
msqid: 16777338
msgget: msgget succeeded (msqid: 16777338)
Hi there, here is msgsnd!
msgsnd: message was successfully placed into message queue 16777338.
Hi there, here is msgrcv!
msgflg: 3600
msgtyp: 0
msgrcv: message was successfully read from message queue 16777338.
We finally made it past the invocation ( msgactsz = 1, mtext: o )!


The source:


#include <stdio.h>
#include <errno.h>
#include <sys/ipc.h>
#include <sys/msg.h>


int main() {


printf("Hi there, here is msgget!\n") ;


/* Parameters */
key_t key = 0 ;
int msgflg = 03600 ;


/* Return value */
int msqid ;


/* Create the message queue */
msqid = msgget( key, msgflg ) ;
printf( "msqid: %i\n", msqid) ;
if ( msqid == -1 )
{


printf("msgget: initializing message queue failed!\n") ;
perror("errno:") ;
return -1 ;


} else
{


printf("msgget: msgget succeeded (msqid: %i)\n", msqid) ;


}


printf("Hi there, here is msgsnd!\n") ;


/* Parameters */
size_t msgsz = 5 ;


struct message {


long mtype ;
const char *mpointer ;


} ;


struct message msg ;


msg.mtype = 0 ;
msg.mpointer = "hello" ;


if ( msgsnd( msqid, msg.mpointer, msgsz, msgflg ) == 0 ) {


printf("msgsnd: message was successfully placed into message
queue %i.\n", msqid) ;


} else
{


printf("msgsnd: sending message to message queue %i failed.
\n", msqid) ;
return -1 ;


}


printf("Hi there, here is msgrcv!\n") ;


/* Parameters */
int msgtyp = 0 ;


struct message_rcv {


long mtype ;
char messtxt[msgsz] ;


} *msg_rcv ;


msg_rcv = malloc( msgsz*sizeof(char) + sizeof(long) ) ;


/* Receive the message */


printf("msgflg: %5o\n", msgflg) ;
printf("msgtyp: %d\n", msgtyp) ;


long msgactsz ; // Actual number of bytes placed in the structure


if ( msgactsz = msgrcv( msqid, msg_rcv, msgsz, msgtyp,
IPC_NOWAIT ) != -1 ) {


printf("msgrcv: message was successfully read from message
queue
%i.\n", msqid) ;


} else
{


printf("msgrcv: receiving message from message queue %i
failed.
\n", msqid) ;
fprintf( stderr, "errno: %i\n", errno ) ;


return -1 ;


}


printf("We finally made it past the invocation ( msgactsz = %d,
mtext: %s )!\n", msgactsz, msg_rcv->messtxt ) ;


return 0 ;



}


Hope somebody can !

Cheers


Bernd


  Réponse avec citation
Vieux 27/05/2008, 12h12   #2
Joachim Schmitz
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Problem with message queues / msgrcv

bernd wrote:
> Hi netties,
>
> posted this in a different group already, which seems to be
> inappropriate.

unfortunatly you're wrong here too as messages queue are not part of the C
standard, try comp.unix.programmer.

Bye, Jojo


  Réponse avec citation
Vieux 27/05/2008, 20h04   #3
Antoninus Twink
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Problem with message queues / msgrcv

On 27 May 2008 at 10:59, bernd wrote:
> I create a message queue with msgget(), sent a 5-byte message to it
> with msgsnd() and try to receive the queue's content with msgrcv().
> Everything seems to work fine, apart from the fact that I get back
> only the last byte back from the original message (after sending the
> message ipcs -qA shows clearly that there are 5 Bytes waiting in the
> queue).


First up, there are several minor problems with your code (a missing
header, wrong format specifier for printf, an assignment needing
parentheses to do what you want it to do...), all of which you can find
by turning up the warning level on gcc. Another fairly serious problem
is that you declare an array of length msgsz, where msgsz is a variable.
You can't do that, even with C99's VLAs, since your array is a member of
a structure.

For now, let's replace

> size_t msgsz = 5 ;


with
#define msgsz 6
which will also give us space for the null-terminator at the end of the
"hello" string.

As to your actual problem, it's in the sending stage.

> struct message {
> long mtype ;
> const char *mpointer ;
> } ;
> struct message msg ;
>
> msg.mtype = 0 ;
> msg.mpointer = "hello" ;
>
> if ( msgsnd( msqid, msg.mpointer, msgsz, msgflg ) == 0 ) {

[snip]

The first thing to note is that msg.mtype must be > 0.

The second thing is that the second argument to msgsnd needs to be a
pointer to a struct message: use &msg instead of msg.mpointer.

But the really slippery point is that this is one of those occasions
when arrays and pointers aren't interchangeable. Let's suppose for the
sake of argument that msg.mpointer is at address 0xDEADBEEF, and think
about what msgsnd is going to do when you pass it &msg. It will try to
read msgsz (i.e. 6) characters from memory locations 0xDEADBEEF,
0xDEADBEF0, ..., 0xDEADBEF4. That's unfortunate, because 0xDEADBEEF
through 0xDEADBEF2 (on a 32-bit system) contain a pointer to the string
literal "hello" in the data segment of your program, while the last two
bytes are garbage.

So you should change the sending code to look like this:

struct message {
long mtype ;
char mtext[msgsz];
} ;
struct message msg;

msg.mtype = 1;
strcpy(msg.mtext, "hello");

if ( msgsnd( msqid, &msg, msgsz, msgflg ) == 0 ) {
...

  Réponse avec citation
Réponse


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Fuseau horaire GMT +1. Il est actuellement 18h11.


Édité par : vBulletin® version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone
PHWinfo est un site Éducation Sans Frontières ©2000-2008
Ad Management by RedTyger
©Tous droits réservés par les parties respectives
Page generated in 0,12215 seconds with 11 queries