Однако на стороне потребителя я столкнулся с проблемой: дополнительный символ появляется в начале каждой строки, считываемой из общей памяти. В частности:
Первая строка имеет дополнительную цифру 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);
}
Код: Выделить всё
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