在boost.interprocess中从共享内存中memcpy的问题

时间:2010-03-03 17:35:19

标签: c++ shared-memory boost-interprocess

这让我感到沮丧。我只是想创建一个共享内存缓冲类,它在通过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;
}

当我运行它时,它会将数据写入OK,但会在读取循环中的第一个memcpy上进行段错误。 gdb说以下内容:

  

程序收到信号EXC_BAD_ACCESS,无法访问内存。   原因:KERN_INVALID_ADDRESS位于地址:0x0000000000000000   __memcpy()

中的0x00007fffffe007c5      

(gdb)其中

     __memcpy()中的

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

功能如此简单,我不知道我缺少什么。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:6)

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++;
}

答案 1 :(得分:0)

我无法在这里测试,因为我没有boost可用,但我有猜测。在此 example 中,  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更改为正确的标记。