【问题标题】:Segmentation fault when accessing shared memory in C在 C 中访问共享内存时出现分段错误
【发布时间】:2016-12-07 23:26:53
【问题描述】:

我有 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 中读取字符串 (char*)?

【问题讨论】:

  • 使用strcpy与字符串是否在共享内存无关。 name 指向什么内存,您是如何分配该内存的?
  • @immibis 我正在使用 strcpy 指向共享内存指针。我用 char * str = "string" 分配。
  • 所以tptr = mmap(...); char *str = "string"; strcpy(tptr->name, str);?
  • @immibis 这行不通,因为tptr->name 没有特定的价值,所以你将垃圾(可能为NULL)传递给strcpy
  • @DavidSchwartz 知道为什么它不起作用。我问提问者是否是提问者写的。

标签: c memory struct shared mmap


【解决方案1】:

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

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

#define MAX_NAME_SIZE 100

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    相关资源
    最近更新 更多