在 C 中访问共享内存时出现分段错误

Segmentation fault when accessing shared memory in C

我有2个程序需要共享内存。我们称一个程序为 A,另一个程序为 B。

有一个用于此目的的结构:

struct town_t {
    int population;
    char * name; 
}

在程序A中,使用mmap将数据写入共享内存。这适用于程序 A。(它使用 strcpy 作为 name

程序B的目的是简单的读取数据。这也适用于 mmap。访问共享内存的 population 字段没有任何问题。但是,访问 population 字段会出现分段错误。

因为我使用了 strcpy,所以整个字符串应该在共享内存中吧?

我使用以下标志来获取指向共享内存的指针,returns没有错误。

tptr = (struct town_t *) mmap(0, 1024, PROT_READ, MAP_SHARED, shm_fd, 0)

我怎样才能真正从程序 B 中读取字符串 (char*)?

将指针放入共享内存毫无意义。指针给出了特定进程地址 space 内的位置。它对具有另一个地址 space 的另一个进程没有任何意义。 (有一些复杂的例外,例如在调用 fork 之前分配的内存指针,相关进程 运行 访问相同的可执行文件。)

如果愿意,您可以将字符串数据本身存储在共享内存中。例如,这将起作用:

#define MAX_NAME_SIZE 100

struct town_t
{
    int population;
    char name[MAX_NAME_SIZE];
};