Message Queue with fork() help


 
Thread Tools Search this Thread
Top Forums Programming Message Queue with fork() help
# 1  
Old 01-13-2006
Message Queue with fork() help

hi all...
ive been trying this program where i spawn 4 threads... and i am trying to use message queue to send msgs from 3 of the threads to the parent thread... but it doent seem to be working... ive almost pulled out my hair tryin to fix the prob Smilie

another wierd thing is that it worksthe 1st time when i reboot the system then stops workin

also im getting the msgqid=0...

here is the code:

HTML Code:
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdlib.h>
#include<errno.h>
 
struct message
{
        int type;
        int msg;
};
 
int main(void)
{
        pid_t pid0,pid1,pid_p,pid_c1,pid_c2,pid_c3;
        key_t key;
        int msgqid;
        //extern int errno;
        struct message *msgs,*msgr;
        pid_p=getpid();
 
        if((key=ftok("abc.txt",'c'))==-1)
                perror("Error in ftok\n");
        else
                printf("Ftok executed.Key=%d\n",key);
 
        if((msgqid=(msgget(key,0666|IPC_CREAT))==-1))
                perror("Error creating queue\n");
        else
                printf("Queue created.MSGQID=%ld\n",msgqid);
 
        pid0=fork();
        if(pid0<0)
        {
                perror("Error in fork\n");
        }
 
        pid1=fork();
        if(pid1<0)
        {
                perror("Error in fork\n");
        }
 
        if(pid0==0 && pid1==0)
        {
                pid_c1=getpid();
                printf("In child.Process ID=%d\n",pid_c1);
                msgs->type=1;
                msgs->msg=1;
                if(msgsnd(msgqid,&(msgs->type),sizeof(struct message),1)==-1)
                {       printf("%d\n",errno);perror("Message not sent.Type 1\n");}
 
                else
                        printf("Message sent.Type 1\n");
        }
 
        if(pid0==0 && pid1!=0)
        {
                pid_c2=getpid();
                printf("In child.Process ID=%d\n",pid_c2);
                msgs->type=2;
                msgs->msg=2;
                if(msgsnd(msgqid,&(msgs->type),sizeof(struct message),2)==-1)
                        perror("Message not sent.Type 2\n");
                else
                        printf("Message sent.Type 2\n");
        }
 
        if(pid0!=0 && pid1==0)
        {
                pid_c3=getpid();
                printf("In child.Process ID=%d\n",pid_c3);
                msgs->type=3;
                msgs->msg=3;
                if(msgsnd(msgqid,&(msgs->type),sizeof(struct message),3)==-1)
                        perror("Message not sent.Type 3\n");
                else
                        printf("Message sent.Type 3\n");
        }
 
        if(pid0!=0 && pid1!=0)
        {
                wait(NULL);
                wait(NULL);
                wait(NULL);
                printf("In parent.Process ID=%d\n",pid_p);
                                 
                if(msgrcv(msgqid,&(msgr->type),sizeof(struct message),1,0)==-1)
                        perror("Message not recvd.Type 1\n");
                else
                        printf("Message revcd.Type 1\n");
 
                if(msgrcv(msgqid,&(msgr->type),sizeof(struct message),2,0)==-1)
                        perror("Message not recvd.Type 2\n");
                else
                        printf("Message revcd.Type 2\n");
 
                if(msgrcv(msgqid,&(msgr->type),sizeof(struct message),3,0)==-1)
                        perror("Message not recvd.Type 3\n");
                else
                        printf("Message revcd.Type 3\n");
 
                if(msgctl(msgqid,IPC_RMID,NULL)==-1)
                        perror("Error removing queue\n");
                else
                        printf("Queue removed\n");
        }
 
        exit(0);
}

Last edited by strider; 01-14-2006 at 11:25 AM..
# 2  
Old 01-13-2006
I cannot read your code, so it's hard to get the logic flow. Please use code tags.

As far as I can tell, you have the right calls to create a msg queue, create a msg and read a msg. I just cannot see your logic.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Ubuntu

Message Queue in Linux

Hello How can I see the created message queues in the system? (4 Replies)
Discussion started by: xyzt
4 Replies

2. Programming

UNIX Message Queue

Hello !!!!! I have a simple question but i can't find the answer anywhere hope to meet it here. Why it is a bad idea to pass pointers through message queues ? Most structs i see all of their char types are arrays... Is it becase having pointers means we could possibily send wrong bytes ? For... (2 Replies)
Discussion started by: qlyine
2 Replies

3. Programming

Message Queue Problem

Hi all, I need help about message queues, i have a server-client program that communicates each other via msg queue, firstly server opens its msg queue and waits for msg then client opens server msg queue and its own msg queue(for receiving msg from server,clients sends msg to server msg... (7 Replies)
Discussion started by: SaTYR
7 Replies

4. Programming

How to limit max no of message in a posix message queue

Hii can anyone pls tell how to limit the max no of message in a posix message queue. I have made changes in proc/sys/fs/mqueue/msg_max But still whenever i try to read the value of max. message in the queue using attr.mq_curmsgs (where struct mq_attr attr) its giving the default value as 10.... (0 Replies)
Discussion started by: mohit3884
0 Replies

5. Programming

message queue

Hello, i need to write a message queue "chat server", that should work only localy. Can anyone please help me with some ideas and peshaps code. I'm studying the UNIX IPC mechanisms right now. So far, i understand how it works but i still cannot get an idea how to write a chat programm... ... (2 Replies)
Discussion started by: etenv
2 Replies

6. IP Networking

message queue problem

I am sending and retriving the message to the queue the problem is after retrieving the message can i see what is there in my message queue. (actually in my application i am encountring some garbage value) so i want to retieve this garbage value and also want to know its size how... (0 Replies)
Discussion started by: ramneek
0 Replies

7. Programming

Message Queue Problem Again..

Is there any way one can delete , say , a particular message from a message queue on system V? (2 Replies)
Discussion started by: satansfury
2 Replies

8. Programming

Deleting ALL message queue

hi all, I'm working on this problem for 2 days. Can somebody tell me that how to delete all message queues from the system ? Since "ipcs -q" gives the list of all existing message queue, then there must be a system call and data stucture where from I can fetch the data about all existing... (2 Replies)
Discussion started by: v_rathor
2 Replies

9. Programming

a message queue question..

Hi there: Thanks first. When I use a message queue amony severl processes, will I have to synchronize the queue? I don't think I would have to because a message queue is implemented in a link listed. Correct me If I am wrong... (0 Replies)
Discussion started by: yanhu
0 Replies

10. UNIX for Advanced & Expert Users

Unix message Queue

Hi, I am working closly with unix message queues i have encountered the following - after creating the Q and start working with it (pushing & pulling) i receive the following stange parameters on the q's - STIME=no_entry Qnum=0 CBYTES=4140 when this happens, the Q is disabled (meaning i... (3 Replies)
Discussion started by: kel
3 Replies
Login or Register to Ask a Question