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