проблема с memcpy'ing из разделяемой памяти в boost.interprocess - PullRequest
1 голос
/ 03 марта 2010

Это сводит меня с ума от разочарования. Я просто пытаюсь создать класс буфера совместно используемой памяти, который использует разделяемую память, созданную с помощью Boost.Interprocess, где я могу читать / хранить данные. Я написал следующее, чтобы проверить функциональность

#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <iostream>
using namespace std;
using namespace boost::interprocess;

int main( int argc, char* argv[] ) {
    shared_memory_object::remove( "MyName" );
    // Create a shared memory object
    shared_memory_object shm ( create_only, "MyName", read_write );
    // Set size for the shared memory region
    shm.truncate(1000);
    // Map the whole shared memory in this process
    mapped_region region(shm, read_write);
    // Get pointer to the beginning of the mapped shared memory region
    int* start_ptr;
    start_ptr = static_cast<int*>(region.get_address());

    // Write data into the buffer
    int* write_ptr = start_ptr;
    for( int i= 0; i<10; i++ ) {
        cout << "Write data: " << i << endl;
        memcpy( write_ptr, &i, sizeof(int) );
        write_ptr++;
    }

    // Read data from the buffer
    int* read_ptr = start_ptr;
    int* data;
    for( int i= 0; i<10; i++ ) {
        memcpy( data, read_ptr, sizeof(int) );
        cout << "Read data: " << *data << endl;
        read_ptr++;
    }

    shared_memory_object::remove( "MyName" );
    return 0;
}

Когда я запускаю это, он записывает данные в порядке, но segfaults на первом memcpy в цикле чтения. GDB говорит следующее:

Программа получила сигнал EXC_BAD_ACCESS, Не удалось получить доступ к памяти. Причина: KERN_INVALID_ADDRESS по адресу: 0x0000000000000000 0x00007fffffe007c5 в __memcpy ()

(gdb), где

# 0 0x00007fffffe007c5 в __memcpy () # 1 0x0000000100000e45 в main (argc = 1, argv = 0x7fff5fbff9d0) в try.cpp: 36

Функциональность настолько проста, я не знаю, что мне не хватает. Любая помощь будет высоко ценится.

Ответы [ 2 ]

6 голосов
/ 03 марта 2010

data не указывает ни на что. (Убедитесь, что программа компилируется со всеми включенными предупреждениями.) Похоже, это не должен быть указатель в любом случае.

Второй цикл, вероятно, должен быть:

int* read_ptr = start_ptr;
int data;
for( int i= 0; i<10; i++ ) {
    memcpy( &data, read_ptr, sizeof(int) );
    cout << "Read data: " << data << endl;
    read_ptr++;
}
0 голосов
/ 03 марта 2010

Я не могу проверить это здесь, потому что у меня нет boost в наличии, но у меня есть предположение. В этом примере , объект shared_memory_object сначала используется для записи с флагом create_only.

shared_memory_object shm (create_only, "MySharedMemory", read_write);

Затем он читается со вторым shared_memory_object объектом с флагом open_only:

shared_memory_object shm (open_only, "MySharedMemory", read_only);

Кажется, вы должны изменить свой shared_memory_object на соответствующий флаг.

...