Почему мой потребитель в модели производитель-потребитель добавляет дополнительный символ в начале каждой строки из общеC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему мой потребитель в модели производитель-потребитель добавляет дополнительный символ в начале каждой строки из обще

Сообщение Anonymous »

Я реализую модель производитель-потребитель на C++, используя общую память и семафоры в Linux. Производитель записывает строки в буфер общей памяти, а потребитель читает эти строки. На стороне производителя все выглядит правильно: с помощью проверки памяти я подтвердил, что данные записываются в общую память, как и ожидалось.
Однако на стороне потребителя я столкнулся с проблемой: дополнительный символ появляется в начале каждой строки, считываемой из общей памяти. В частности:
Первая строка имеет дополнительную цифру 1 в начале.
Последующие строки имеют дополнительную цифру \0 в начале.
Вот соответствующие части моего кода:
Код производителя (функцияinsert_item):

Код: Выделить всё

void insert_item(const ShmQueue &queue, const Product &item)
{
ShmStruct *shm_addr = (ShmStruct *)shmat(queue.shm_id, nullptr, 0);
if (shm_addr == (ShmStruct *)-1)
{
throw std::runtime_error("Failed to attach shared memory");
}

int index = shm_addr->in;

// Clear the buffer to avoid leftover data
memset(shm_addr->buffer_queue[index], 0, BUFFER_SIZE);

// Copy string to the shared memory buffer
strncpy((char *)shm_addr->buffer_queue[index], item.c_str(), BUFFER_SIZE - 1);
shm_addr->buffer_queue[index][BUFFER_SIZE - 1] = '\0';

// Update in pointer
shm_addr->in = (shm_addr->in + 1) % BUFFER_QUEUE_LEN;

shmdt(shm_addr);
}
Код потребителя (функция consume_item):

Код: Выделить всё

Product consume_item(const ShmQueue &queue)
{
ShmStruct *shm_addr = (ShmStruct *)shmat(queue.shm_id, nullptr, 0);
if (shm_addr == (ShmStruct *)-1)
{
throw std::runtime_error("Failed to attach shared memory");
}

int index = shm_addr->out;

// Read string from the shared memory buffer
Product product((char *)shm_addr->buffer_queue[index]);

// Update out pointer
shm_addr->out = (shm_addr->out + 1) % BUFFER_QUEUE_LEN;

shmdt(shm_addr);
return product;
}

Если вам нужен более подробный код, дайте мне знать. Будем признательны за любую информацию об обработке общей памяти или возможных причинах этой проблемы!
Вот несколько соответствующих снимков:
Изображение
Я тщательно проверил свой код, но не могу точно определить, почему этот дополнительный символ отображается только в операции чтения потребителя.
[< img alt="введите здесь описание изображения" src="https://i.sstatic.net/oT0Wfo6A.png" />]
[img]https://i.sstatic. net/1X9P983L.png[/img]
(https://i.sstatic.net/oT0Wfo6A.png)
Что я пробовал
Проверил данные производителя: использование памяти с помощью инструмента проверки я подтвердил, что данные правильно записываются в общую память в ожидаемом формате.
Гарантированная очистка буфера: я использовал memset для очистки каждого буфера в Insert_item перед записью, чтобы предотвратить остатки данных от предыдущих записей.
Побайтовая проверка: я использовал шестнадцатеричный вывод в потребителе для печати каждого байта buffer_queue[index] для проверки содержимого и подтвердил, что дополнительный символ действительно присутствует в начале каждой строки.

Подробнее здесь: https://stackoverflow.com/questions/791 ... ter-at-the
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»