C Posix - msgsnd() msgrcv


 
Thread Tools Search this Thread
Top Forums Programming C Posix - msgsnd() msgrcv
# 1  
Old 02-06-2009
C Posix - msgsnd() msgrcv

Hey guys, Im doing message passing for the first time on a linux OS. Im new to C programming, so bear with me. I made two .c files : central.c and external.c

I simply wanted to pass a message from the central process to the external process. BUT Whenever each process gets to the msgsnd()/msgrcv() method the processes stall there. In the command line I start both processes with:
Code:
./central 60 & ./external 1 60

central.c
Code:
#include <stdio.h> 
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/msg.h>

typedef struct mymsg{
 long priority;
 int temp;
 int pid;
 int stable;
}msgp;

int main(int argc, char *argv[])
{
 msgp msgp;
 msgp.priority=2;
 msgp.temp=(int) argv[1];
 msgp.pid=70;
 msgp.stable=0;

//Create central mailbox
 int stat, msqid;
 if ((msqid = msgget(0070, 0666 | IPC_CREAT)) < 0) {
   perror("msgget");
   return 1;
 }
 else 
   (void) fprintf(stderr,"Central msgget: msgget succeeded: msqid = %d\n", msqid);

//Send message to external processes
 stat = msgsnd(msqid, &msgp, sizeof(msgp) - sizeof(long), 0);
 if ( stat < 0) {
    printf ("Insert details of message sent");
    perror("msgsnd");
    return 1;
 }
 else {
   printf("Central successfully sent the Message");
 }

 //temp=(2*temp+exTemps)/6;
 return 0;

}

external.c
Code:
#include <stdio.h> 
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/msg.h>

typedef struct my_msg{
 long priority;
 int temp;
 int pid;
 int stable;
}msgp;

int main(int argc, char *argv[])
{
 msgp msgp;
 msgp.priority=2;
 msgp.temp=(int) argv[1];
 msgp.pid=(int) argv[2];
 msgp.stable=0;

 int msqid, stat;

//Create external mailbox
 if ((msqid = msgget(0070, 0666 | IPC_CREAT)) < 0) {
   perror("msgget");
   return 1;
 }
 else 
   (void) fprintf(stderr,"External msgget: msgget succeeded: msqid = %d\n", msqid);

//Wait to receive message
 stat = msgrcv(msqid, &msgp, sizeof(msgp)-sizeof(long), 2, 0);
 if (stat < 0) {
    printf ("Insert details of attempted received message");
    perror("msgrcv");
    exit(1);
 }
 else {
   printf("External successfully received the Message");
 }

 return 0;

}

Any comments or help would be much appreciated!Smilie

Last edited by carl33p; 02-06-2009 at 09:16 PM..
# 2  
Old 02-07-2009
Compiling your receiver program generated these warnings on my platform:
Code:
msgrcv.c: In function 'main':
msgrcv.c:17: warning: cast from pointer to integer of different size
msgrcv.c:18: warning: cast from pointer to integer of different size
msgrcv.c:36: warning: incompatible implicit declaration of built-in function 'exit'

These warnings are nothing to sneeze at. The first two in particular are for these lines:

Code:
 msgp.temp=(int) argv[1];
 msgp.pid=(int) argv[2];

This does not do what you think they do! Adding the line
Code:
printf("msgp.temp=%d msgp.pid=%d\n", msgp.temp, msgp.pid);

shows
Code:
msgp.temp=-521312457 msgp.pid=-521312455

Operators in C can't convert anything except atomic types, which strings aren't; as far as C's concerned strings are just arrays and pointers. What you're getting is the memory address the string is stored in. It may not have generated a warning for your platform, if pointers and integers are the same size on it(i.e. 32-bit. I'm running 64-bit.)

You need to use a library function to convert them from strings. A quick-and-dirty fix would be to use atoi(argv[1]) and atoi(argv[2]) instead. These need you to include stdlib.h.

The last warning says the function exit() has no prototype, because it needs stdlib.h too. Best not to ignore those warnings since they can cause crashes in some circumstances.
# 3  
Old 02-07-2009
Also, I don't think your receiver program needs the IPC_CREAT flag. It may be making a brand-new queue overtop your old one.
# 4  
Old 02-08-2009
Thanks for the help!

This thread can be closed. Everything else got figured out.Smilie
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

Message queue is not blocked in msgsnd

Hi, I am trying to send/receive data by message queue and expecting it to be blocked on send/read for other side (at least this is my understooding ) , I am connecting message between perl<->C , perl is working as expected , but in C msgsnd and msgrcv are not waiting (blocked) untill second side... (6 Replies)
Discussion started by: alexse
6 Replies

2. Programming

POSIX Thread Help

I want to create a program that creates 2 child process, and each of them creates 2 threads, and each thread prints its thread id. I0ve allread done that the outuput isn't the outuput i want. When a run the following comand "$./a.out | sort -u | wc -l" I have the folowing output 2 $: It should... (3 Replies)
Discussion started by: pharaoh
3 Replies

3. UNIX for Advanced & Expert Users

System V or POSIX

Hi , I am using UNIX network programming Vol1 (by R Stevens) book to learn about IPC. I would be using HP-UX,Solaris and Linux at my work. I have sections for POSIX and for System V in that book. I am quite confused in indentifying those OSs as POSIX or SYstem V. Can anyone please... (1 Reply)
Discussion started by: kumaran_5555
1 Replies

4. UNIX for Dummies Questions & Answers

IPC Message Queue. msgrcv doesnt work..

Hi everybody, this is the situation. there is a programm XYZ which opens a message queue with the key 47110815 and waits for a SIGUSR1. After receiving this signal it sends a message with type 100 and a number (as ASCII) in the message-body. I have to write a prog which frist sends the... (1 Reply)
Discussion started by: daredevil82m
1 Replies

5. What is on Your Mind?

Linux posix

Hi everybody, i couldn't think of any better place to ask this question. Does LINUX totally confirm with ALL of the POSIX standards??. If not which areas does it diverge?? my apologies if this questions seems sooo stupid to some of you.. thanks (0 Replies)
Discussion started by: abhiram7
0 Replies

6. UNIX for Advanced & Expert Users

Posix threads

Hi, consider the code below: #include <stdio.h> . . struct myStruct { char *message ; int id; }; . . . void *thread_function( void *ptr ); nt main() { pthread_t thread1, thread2 ,thread3 ; struct myStruct nico1; (2 Replies)
Discussion started by: Behnaz
2 Replies

7. Programming

Posix

HI, When i am configuring php in SUN Solaris. I am getting the below error. configure: error: Your system seems to lack POSIX threads. Do i need to install POSIX? If so can somebody let me know where can i download POSIX for Solaris 8? Thanks, (2 Replies)
Discussion started by: Krrishv
2 Replies

8. AIX

msgrcv crash in AIX 5.3 SP6

Hi All, I have a piece of code like blow. It is working fine with AIX 5.3 SP3. When the same thing is getting executed in AIX 5. SP6 it is giving segmentation fault. If I put debug statements before and after, it works fine. rc = msgrcv(mqid, &msg, size, HIGH_PRIORITY_FIRST , 0) ... (0 Replies)
Discussion started by: sandhya_chp
0 Replies

9. UNIX for Dummies Questions & Answers

msgrcv : Invalid argument

Hi All, Please guide me how to get rid : msgrcv : Invalid argument. I am using message queues: msgsnd and msgrcv, I am able to send through msgsnd and receive through msgrcv, but at times i get the belo error. msgrcv : Invalid argument. (1 Reply)
Discussion started by: answers
1 Replies

10. Programming

msgrcv pending forever !!!

When I am using msgrcv to get a message from a queue, in case of msgsnd some error, the msgrcv thread will waiting forever. Is there some way that I can specify a time out value for this queue ? just let msgrcv wait for some time, if no message comes during this time slot, msgrcv just return... (3 Replies)
Discussion started by: Yun Gang Chen
3 Replies
Login or Register to Ask a Question