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

时间:2016-12-07 23:26:53

标签: c memory struct shared mmap

我有两个需要共享内存的程序。我们叫一个程序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中读取字符串(char *)?

1 个答案:

答案 0 :(得分:1)

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

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

#define MAX_NAME_SIZE 100

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