我有一个通信队列的问题。在我尝试编写的服务器程序中,我需要在使用 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 我什至尝试使用 sleep 函数来等待子进程,但它没有帮助。
最佳答案
msgrcv/msgsnd
采用从 msgget
返回的整数 msqid 不是 key 。
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,因为这正是您正在尝试的阅读。
关于c - 进程与消息队列的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20845850/