http://oddy.blog.hexun.com/35075506_d.html
今天写了一个小程序,使用了消息队列的msgsnd msgrcv函数,由msgsnd函数循环处理由终端输入的消息,然后把它发送到消息队列,而另一个进程则循环读取消息,进行处理。
这时,问题出现了,每次调用msgrcv函数的时候,它总是第一次调用成功,而第二次返回错误,察看errno=22,打印出来是invalid argument,无效参数。
凭它的说明,可以看出可能是我调用函数的时候参数错误,但为什么第一次能调用成功呢?
检查了一下,没看出问题。然后google之,发现许多人和我出现了同样的问题,但没有人给出解答。
自己鼓捣了好久,还是没搞定。
然后man 2 msgsnd,一下午不知打了多少遍了,这一次从头到尾一个字一个字的读了下去。
终于发现问题了。
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
man文档里有一句话:
The mtext field is an array (or other structure) whose size is specified by msgsz 一直没认真去看,想当然的以为msgsz就是msgp的大小了,原来人家不是,自己自作多情了。。。
这么一个小问题花了我半个下午,但现在发现总比以后出错要好多了~
写出来,给那些第一次使用的朋友们看~~
把修改后的代码贴出来:
struct s_msg{
long type;
char mtext[256];
};
//snd
int main()
{
int mid;
if((mid=msgget(4446,IPC_CREAT|0666))==-1)
perr_exit("msgget:");
char buf[BUFSIZE];
memset(buf,'