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]
으로 바꾸면이 문제가 발생하지 않습니다.
나는 주위에 어떤 방법이 있는지 알고 싶습니다. 그렇지 않은 경우 왜 그렇게됩니까?
감사합니다.
포인터는 현재 프로세스 *에 로컬입니다. 공유 메모리에 대한 포인터가 있더라도 공유 메모리는 서로 다른 프로세스의 동일한 주소에 매핑되지 않을 수 있습니다. IPC를 통해 포인터를 전달하지 말고 포인터가 가리키는 * data *, * contents *를 전달하십시오. –
내 필드의 문자 수 제한을 제거하고 여전히 공유 할 수있는 방법을 제안 하시겠습니까? –
이 경우 데이터를 어떻게 전달합니까? –