2010-03-03 3 views
1

이것은 좌절감을 불러 일으키고 있습니다. Boost.Interprocess를 통해 생성 된 공유 메모리에서 사용하는 공유 메모리 버퍼 클래스를 만들려고합니다. 데이터를 읽고 저장할 수 있습니다. 나는 기능boost.interprocess의 공유 메모리에서 memcpy가 나오는 문제

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

내가 이것을 실행하면 데이터의 확인을 기록하지만, 세그먼테이션 폴트 (segfault) 읽기 루프의 첫 번째 memcpy에를 테스트하려면 다음을 썼다. gdb는 다음을 말합니다 :

프로그램 수신 신호 EXC_BAD_ACCESS, 메모리에 액세스 할 수 없습니다. __memcpy에 0x0000000000000000 0x00007fffffe007c5()

(GDB) 여기서

# __memcpy 0 0x00007fffffe007c5() # 주 1 0x0000000100000e45 (ARGC = 1 ARGV = 0x7fff5fbff9d0) 시도 : 이유 : 주소 KERN_INVALID_ADDRESS .cpp : 36

기능이 너무 간단해서 내가 무엇을 놓쳤는 지 모릅니다. 어떤 도움을 많이 주시면 감사하겠습니다.

답변

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

(홍당무), 확실히 나를 조밀하게 느끼게합니다! TIQL (일시적인 IQ 손실)으로 고통 받고 있습니다 (일시적이라고 생각합니다). 감사합니다. – recipriversexclusion

0

내가 여기를 테스트 할 수 없습니다 내가 사용할 수 boost이 없어하지만 난 추측을 가지고 있기 때문에. 이 example에서, shared_memory_object 개체는 먼저 create_only 플래그로 쓰는 데 사용됩니다.

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

는 그 다음은 플래그 open_only와 두 번째 shared_memory_object 객체와 읽기 : 당신이 당신의 shared_memory_object 적절한 플래그를 변경해야 할 것 같다

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

.