2017-10-29 18 views
0

noob은 C와 함께 경고합니다.shm_open을 사용하여 C 구조체에서 char 포인터 공유

int fd = shm_open("someName", O_CREAT | O_EXCL | O_RDWR, S_IRWXU); 
if (fd < 0) { 
    fd = shm_open("someName", O_CREAT | O_RDWR, S_IRWXU); 
    if (fd < 0) { 
     printf("ERROR: Could not open shared memory space\n"); 
     return -1; 
    } 
} 
(*tables) = mmap(NULL, sizeof(table), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 
ftruncate(fd, sizeof(table)); 
close(fd); 
:

는 I는 shm_open 호출을 사용하여 공유 메모리 객체 (다른 구조체 table라는 단위)이 구조체의 예

typedef struct { 
    char* name 
} info; 

같은 구조체와 배열 기억 (크기 10)가

그러나 문제는 나중에 시나리오와 같은 코드가 발생한다는 것입니다. 프로세스 B가이 코드를 실행하고 텍스트를 넣으면 table 요소의 name 필드에 "foo"라고 말합니다 배열에서 프로세스 A는 char*에 액세스 할 수 없습니다. 내용은 메모리 주소이지만 내용 자체를 작성한 것이 아니라 char*의 실제 내용은 아닙니다. 그러나 char*char[]으로 바꾸거나 char *name 대신 char name[20]으로 바꾸면이 문제가 발생하지 않습니다.

나는 주위에 어떤 방법이 있는지 알고 싶습니다. 그렇지 않은 경우 왜 그렇게됩니까?

감사합니다.

+0

포인터는 현재 프로세스 *에 로컬입니다. 공유 메모리에 대한 포인터가 있더라도 공유 메모리는 서로 다른 프로세스의 동일한 주소에 매핑되지 않을 수 있습니다. IPC를 통해 포인터를 전달하지 말고 포인터가 가리키는 * data *, * contents *를 전달하십시오. –

+0

내 필드의 문자 수 제한을 제거하고 여전히 공유 할 수있는 방법을 제안 하시겠습니까? –

+0

이 경우 데이터를 어떻게 전달합니까? –

답변

0

공유 메모리를 IPC 용으로 사용할 경우, 공유 할 모든 데이터는 공유 메모리에 있어야합니다. 그것은 간단합니다. 주변에는 방법이 없습니다. 그러나 좀 더 크고 가변적 인 데이터 청크에 대해 수행 할 수있는 작업은 단순히 해당 데이터에 대한 전용 공유 메모리 청크를 할당하고 마스터 테이블을 통해 이름을 제공하는 것입니다. 귀하의 경우에 또 다른 옵션은 공유 메모리가 info 구조체보다 충분히 크게 배열하여 name이 이름 데이터가 상주하는 주소에서 오프셋 된 것입니다. 그러면 데이터의 주소는 '& name + * name'입니다.