2013-09-29 3 views
0

이 교과서의 POSIX 공유 메모리 섹션을 살펴 보겠습니다. 나는 약간의 변경을 할 때까지 컴파일 할 코드를 얻을 수 없었다. 공유 메모리에 대한 아이디어와 그것을 여는 방법을 이해하지만 읽기/쓰기에 여전히 혼란 스럽습니다. 텍스트 북 코드는 hello world 문자열 예제를 보여 주었지만 int, 배열, 구조체 등에 적용하는 방법을 잘 모르겠습니다. 여기에 제가 다루고있는 텍스트 북 코드가 있습니다. 다음은 쓰기입니다.POSIX 공유 메모리 쓰기/읽기

const int SIZE = 4096; 
const char *name = "OS"; 
const char *message_0 = "Hello"; 
const char *message_1 = "World!"; 

int shm_fd; 
void *ptr; 

shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666); 
ftruncate(shm_fd, SIZE); 
ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0); 

//sprintf(ptr, "%s", message_0); //non working text book code 
sprintf((char*)ptr, "%s", message_0); //my change to get it to work 
ptr += strlen(message_0); 
//sprintf(ptr, "%s", message_1); 
sprintf((char*)ptr, "%s", message_1); 
ptr += strlen(message_1); 

그리고 여기에 있습니다.

const int SIZE = 4096; 
    const char *name = "OS"; 
    int shm_fd; 
    void *ptr; 

    shm_fd = shm_open(name, O_RDONLY, 0666); 
    ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fd, 0); 

    printf("%s", (char*)ptr); 
    shm_unlink(name); 

int를 읽거나 쓰려면이를 변경하려고 시도했지만 작동하지 못했습니다. 나는 내가 좋아하는 int 위해 뭔가를 할 수 있어야 인상이었다

*ptr = 2; 
ptr++; 

하지만, 나는 그것을 얻을 수 없었다, 또는 내가 노력 다른 방식으로 작동 할 수 있습니다. 아무도 그것을 더 잘 설명 할 수 있습니까? 감사.

답변

1

mmap 결과를 int * 또는 double * 또는 원하는대로 전송할 수 있습니다. 당신이 할 수있는 한 가지는 구조체를 공유 메모리에 오버레이하는 것입니다 :

struct MyStruct 
{ 
    int s_int; 
    char s_str[64]; 
}; 

void* mem = mmap ... 
struct MyStruct* sp = (struct MyStruct*)mem; 

/* writing */ 
sp->s_int = 3; 
strcpy(sp->s_str, "Hello"); 

/* reading */ 
printf("s_int=%d, s_str=%s\n", sp->s_int, sp->s_str); 
+0

저를 위해 그것을 정리해 주셔서 감사합니다. 그것은 내가 필요한 것입니다. – Lucas

관련 문제