处理与消息队列的通信

时间:2013-12-30 19:09:39

标签: c linux posix message-queue

我遇到通讯队列问题。在我正在尝试编写的服务器程序中,我需要在使用fork函数创建的两个进程之间进行通信。 我收到Invalid Argument错误,但我不知道为什么。这是我简化的非工作代码。

key_t key = ftok(".",'A');
msgget(key,IPC_CREAT);
perror(""); //receive succes

if(fork()>0){
    msgbuf dat;

    msgrcv(key,(void*)&dat,(size_t)sizeof(dat),500,0);
    perror(""); //receive INVALID ARGUMENT
    cout<<dat.mtext<<endl;
}
else
{
    msgbuf data;
    data.mtext[0]='a';
    data.mtype=500;

    msgsnd(key,(void*)&data,(size_t)sizeof(data),0);
    perror(""); //receive INVALID ARGUMENT
}

我应该纠正什么才能使它发挥作用?

P.S我甚至尝试使用睡眠功能来等待子进程,但它没有帮助。

1 个答案:

答案 0 :(得分:1)

msgrcv/msgsnd获取从msgget 返回的整数msqid,而不是键。

int qid = msgget(key, IPC_CREAT);

msgrcv(qid, (void*)&data, (size_t) sizeof(data), 500, 0);

//..........

msgsnd(qid,(void*) &dat,(size_t) sizeof(dat), 0);

请记住,data结构应该包含一个long msgtype作为您设置的第一个字段,在这种情况下可能是msgtype = 500,因为这是您尝试阅读的内容。