我遇到通讯队列问题。在我正在尝试编写的服务器程序中,我需要在使用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我甚至尝试使用睡眠功能来等待子进程,但它没有帮助。
答案 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,因为这是您尝试阅读的内容。