我有2个需要共享内存的程序。让我们称呼一个程序A,另一个程序B。
为此目的,有一个格式的结构:
struct town_t {
int population;
char * name;
}
在程序A中,数据使用MMAP写入共享内存。这适用于程序A。(它使用strcpy用于name
)
程序B的目的是简单地读取数据。这也可以与MMAP一起使用。访问共享内存的population
字段毫无问题。但是,访问population
字段给出了分段故障。
既然我使用了strcpy,则整个字符串应该在共享内存中?
我使用以下标志获取指向共享内存的指针,该指针返回没有错误。
tptr = (struct town_t *) mmap(0, 1024, PROT_READ, MAP_SHARED, shm_fd, 0)
我该如何做到这一点,以便我可以实际读取b?
将指针放入共享内存是没有意义的。指针在特定过程的地址空间内提供了一个位置。它对另一个地址空间的另一个过程没有意义。(除了一些复杂的例外,例如通过运行相同可执行文件访问的相关进程访问的fork
的指针分配了内存的指针。)
如果需要,您可以将字符串数据本身存储在共享内存中。例如,这将有效:
#define MAX_NAME_SIZE 100
struct town_t
{
int population;
char name[MAX_NAME_SIZE];
};