在 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];
};
我有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];
};