2014-02-18 6 views
7

Linux에서 내 프로세스의 일부 메모리 컨텐츠를 다른 프로세스와 공유하려고합니다. 이 작업을 수행하는 방법 중 하나는 shm_open 및 mmap을 사용하는 것입니다. 아래처럼.기존 메모리를 shm_open과 어떻게 공유합니까?

/* Create a new memory object */ 
fd = shm_open("/bolts", O_RDWR | O_CREAT, 0777); 
if(fd == -1) { 
    fprintf(stderr, "Open failed:%s\n", 
     strerror(errno)); 
    return EXIT_FAILURE; 
} 

/* Set the memory object's size */ 
if(ftruncate(fd, sizeof(*addr)) == -1) { 
    fprintf(stderr, "ftruncate: %s\n", 
     strerror(errno)); 
    return EXIT_FAILURE; 
} 

/* Map the memory object */ 
addr = mmap(0, sizeof(*addr), 
     PROT_READ | PROT_WRITE, 
     MAP_SHARED, fd, 0); 
if(addr == MAP_FAILED) { 
    fprintf(stderr, "mmap failed: %s\n", 
     strerror(errno)); 
    return EXIT_FAILURE; 
} 

그러나 이렇게하면 "이미 할당 된 메모리"를 공유 할 수 없습니다. 내 질문 : 이전 할당 된 메모리 내용을 다시 할당하지 않고 공유 할 수 있습니까?

미리 감사드립니다.

+0

그것은 당신이 "이미 할당 된 메모리"와 "이전에 할당 된 메모리"무슨 뜻인지 알아내는 것은 매우 어렵다. 그 메모리를 공유하고 싶다면 다른 프로세스가/bolts 경로를 열고 mmap()을 실행하면 두 프로세스가 동일한 메모리 조각을 공유하게됩니다. – nos

+0

읽기 [shm_overview (7)] (http://man7.org/linux/manage/man7/shm_overview.7.html) –

+0

1 단계. RWX 권한이있는 0x1000에 mmaped 메모리 영역이 있다고 가정하고 MAP_PRITAVE | MAP_ANONYMOUS 깃발. 2 단계. 메모리 주소 0x1000에 일부 데이터를 씁니다. 3 단계. 0x1000 (가상 주소는 0x1000이어야 함)의 메모리 내용을 다른 프로세스와 공유하려고합니다. 3 단계에서 멈췄다. – daehee

답변

0

코드는 메모리를 공유하지만 두 프로세스 모두 다른 주소 영역을 갖습니다. 같은 지역을 원하기 때문에 addr 값은 동일합니다. 이 경우이 메모리에 객체를 만들 수 있으며 내부 포인터를 사용하면 객체가 유효하고 두 프로세스에서 모두 볼 수 있습니다.

어떻게 할 수있는 두 가지 방법이 있습니다.

1) 다른 프로세스

2) MAP_FIXED와 특수 주소의 메모리를 할당 할 mmap에 요청을 만들 포크()를 않습니다.

는 두 번째의 경우 코드의 뜻은 같습니다

/* Create a new memory object */ 
fd = shm_open("/bolts", O_RDWR | O_CREAT, 0777); 
if(fd == -1) { 
    fprintf(stderr, "Open failed:%s\n", 
     strerror(errno)); 
    return EXIT_FAILURE; 
} 

/* Set the memory object's size */ 
if(ftruncate(fd, sizeof(*addr)) == -1) { 
    fprintf(stderr, "ftruncate: %s\n", 
     strerror(errno)); 
    return EXIT_FAILURE; 
} 

// You base address for memory region that you want to share. 
// Choose this carefully, you both processes MUST have it available! 
void * baseAddr = 0x7fff00000000; 

/* Map the memory object */ 
addr = mmap(baseAddr, sizeof(*addr), 
     PROT_READ | PROT_WRITE, 
     MAP_SHARED | MAP_FIXED, fd, 0); 

if(addr == MAP_FAILED | MAP_FIXED) { 
    fprintf(stderr, "mmap failed: %s\n", 
     strerror(errno)); 
    return EXIT_FAILURE; 
} 

image

관련 문제