日期:2014-05-16  浏览次数:21567 次

消息队列满后,写不进,读不出
这两天调程序遇见一个很奇怪的问题,
程序中线程和进程中用到了消息队列,
有的写,有的读,
出现问题的时候是:
通过ipcs查看

------ Message Queues --------
key msqid owner perms used-bytes messages  
0x01010001 0 root 666 16384 512  


这个时候调用msgsend时就会阻塞,因为消息满了,而读的线程或者进程也是阻塞,读不出,
也就是提示没有要读取的类型的消息

还有一点不明白的就是为什么会写满?一直有读的,只要写,就会被读走,
这个也可能是读端读取消息队列后处理的时间过长,写端把它写满了?

后来我把系统重启后,恢复正常,
有没有人遇到过这样的问题,帮忙看一下怎么解决,只要出现这个问题,系统就得重启,这真是麻烦啊。
当初了解到《Unix高级环境编程》中不提倡用消息队列,是不是又bug缺陷啊?

------解决方案--------------------
读写速度不一样造成的
------解决方案--------------------
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
int msgflg);

关注msgtpe.
------解决方案--------------------
msgtyp 读和写要同一的