当前位置: 技术问答>linux和unix
linux消息队列,读而不删怎么弄?
来源: 互联网 发布时间:2016-06-19
本文导语: linux中可以通过msgrcv()读取消息队列中的消息,只是一旦被读,消息就会从队列中删除。有没有什么函数可以读出来队列中却不删除的函数?或者自己如何实现一个?前提是不申请额外的空间。 谢谢大虾指教下。 | ...
linux中可以通过msgrcv()读取消息队列中的消息,只是一旦被读,消息就会从队列中删除。有没有什么函数可以读出来队列中却不删除的函数?或者自己如何实现一个?前提是不申请额外的空间。
谢谢大虾指教下。
谢谢大虾指教下。
|
因为当msgrcv()的最后一个参数设置为MSG_NOERROR时,如果读取的队列长度msglen小于消息的实际长度,则会截取msglen长的消息。而不会删除这条消息在队列中的入口。
所以LZ可否将实际需要的数据包在放入队列的时候,在最后随便添加一位,然后用msgrcv()读取的时候,读取需要的长度,而实际的长度=需要的长度+1,因此消息会继续保留在队列中了。
不知道这样行不行,LZ可以试试看
所以LZ可否将实际需要的数据包在放入队列的时候,在最后随便添加一位,然后用msgrcv()读取的时候,读取需要的长度,而实际的长度=需要的长度+1,因此消息会继续保留在队列中了。
不知道这样行不行,LZ可以试试看
|
这应该类似于socket读缓冲区时候的peek功能吧。
消息队列里貌似确实没有这个功能。
http://www.cppblog.com/prayer/archive/2008/08/26/60040.html
你参考下,我觉得是没有。
消息队列里貌似确实没有这个功能。
http://www.cppblog.com/prayer/archive/2008/08/26/60040.html
你参考下,我觉得是没有。
|
貌似没有这个功能。如果自己实现一个,那么可以使用现有的函数和数据结构,自己在msgrcv中实现一个MSG_PEEK操作,如将其参数flags扩展增加MSG_PEEK选项!
|
DESCRIPTION
msgctl() performs the control operation specified by cmd on the message queue with identifier msqid.
|
楼主什么情况想要这种需求?
这种功能貌似比较危险,在数据交互较多的情况,消息队列可能很快就撑爆了。
这种功能貌似比较危险,在数据交互较多的情况,消息队列可能很快就撑爆了。
|
关注一下,
这种情况不危险的,
楼主的要求是peek不是read
是保留了read的功能下的扩展。
|
考虑共享内存