我使用msgrcv函数从消息队列中读取消息。当我读取已知长度数据时它工作正常。有些情况下我的消息长度是可变的。在这样的情况下我如何只分配需要的内存量并从消息队列中读取消息而不会丢失消息队列中的任何数据。请提出想法来克服这个问题。
注意: 在IBM消息队列中,当我们读取超出长度的数据时,它会将消息的实际大小填入我们传递mqget函数的结构中。像这样,有没有办法在消息队列中执行此操作。
答案 0 :(得分:0)
从我对msgrcv()
手册页的简要介绍中,如果您的缓冲区大小太小而且未指定MSG_NOERROR
标志,则msgrcv()
将返回-1(使用errno设置为E2BIG
)并将消息保留在队列中。
在这种情况下,你可以将缓冲区大小加倍(最多MSGMAX
,默认情况下是linux上的8192)并重试。