Читать содержимое динамической длины, используя msgrcv
Я использую функцию msgrcv для чтения сообщений из очереди сообщений. Он отлично работает, когда я читаю данные известной длины. В некоторых случаях длина моего сообщения является переменной. В таком Как я могу выделить только требующийся объем памяти и прочитать сообщение из очереди сообщений без потери каких-либо данных из очереди сообщений. Пожалуйста, дайте идею, чтобы преодолеть эту проблему.
Примечание: В очереди сообщений IBM, когда мы читаем данные с превышенной длиной, он заполняет фактический размер сообщения в структуре, которую мы передаем функции mqget. Вот так, есть ли способ сделать эту операцию в очереди сообщений.
1 ответ
Из моего краткого прочтения msgrcv()
man-страницу, если ваш размер буфера слишком мал и вы не указываете MSG_NOERROR
флаг, msgrcv()
вернет -1 (с errno установлен в E2BIG
) и оставьте сообщение в очереди.
В этом случае вы можете удвоить размер буфера (до MSGMAX
, что на Linux 8192 по умолчанию) и попробуйте снова.