【发布时间】:2014-01-17 17:04:03
【问题描述】:
我的通信队列有问题。在我尝试编写的服务器程序中,我需要在使用 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 我什至尝试使用睡眠功能来等待子进程,但它没有帮助。
【问题讨论】:
-
长期没有像这样进行低级编程,但是从手册页来看,sizeof(dat) 是错误的。它需要是 msgbuf 中 mtext 字段的大小。
-
不要调用
perror(),除非你知道msgrcv()的返回值是-1。errno可能包含虚假值,或者与 3 天前调用的函数相关的值,如果msgrcv()没有表明它失败。如果msrgrcv()确实失败了,那么根据我的手册页,EINVAL(或“无效参数”)表示“msgid无效,或者msgsz小于 0”...
标签: c linux posix message-queue