【问题标题】:Why gives memcpy in shared memory a segmentation fault为什么给共享内存中的 memcpy 一个分段错误
【发布时间】:2018-10-13 20:29:18
【问题描述】:

我当前的项目有问题。

这是我的标题:

#define SHARED_MEMORY_NAME "/osmpmemory"
#define OSMP_MAX_MESSAGES_PROC 16
#define OSMP_MAX_SLOTS 256
#define OSMP_MAX_PAYLOAD_LENGTH 128

typedef struct {
        char msg[OSMP_MAX_PAYLOAD_LENGTH];
    } osmp_msg;

typedef struct {
        size_t memory_size;
        int process_count;
        osmp_msg slots[OSMP_MAX_SLOTS];
    } shm_conf;

这里是我的代码:

shm_conf* memory_conf;
size_t shm_size =  sizeof(shm_conf) + sizeof(int[count][2]) + sizeof(osmp_msg[count][OSMP_MAX_MESSAGES_PROC]);
int fd;

if((fd = shm_open(SHARED_MEMORY_NAME, O_CREAT | O_RDWR, 0640)) == -1) {
        return -1;
    }

if(ftruncate(fd, shm_size) == -1) {
        printf("%s\n", strerror(errno));
        return -1;
    }


if((memory_conf = (shm_conf*)mmap(NULL, shm_size , PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED) {
        printf("%s\n", strerror(errno));
        return 0;
    }

memory_conf->process_count = count;
memory_conf->memory_size = shm_size;

int process_numbers[memory_conf->process_count][2];

for(int i = 0; i < memory_conf->process_count; i++) {
        process_numbers[i][0] = 0;
        process_numbers[i][1] = i;
    }

memcpy(memory_conf + sizeof(shm_conf), process_numbers, sizeof(process_numbers));

我想在 shm_conf 结构之后存储一个二维数组。但是 memcpy 给我一个分段错误,我不知道为什么,你能帮帮我吗?

在这个数组之后我想存储另一个数组,这就是为什么 shm_size 比我目前需要的大。

【问题讨论】:

  • 想法:尺寸和偏移量计算往往容易出错,也许这里也是? IDK,但不是shm_conf* memory_conf; size_t shm_size = sizeof(...,而是考虑struct { shm_conf memory_conf; int pn[count][2]; osmp_msg[count][OSMP_MAX_MESSAGES_PROC] } m; hm_size = sizeof m; 并使用struct 成员:memcpy(&amp;m.pn, process_numbers, sizeof m.pn); 等。
  • 我无法在结构中定义int pn[count][2] 数组,因为结构中不知道变量code
  • 是的,你当然是对的。然而,如果可能的话,通过内存重组,内存需求的可扩展部分可以放在数组的末尾,例如使用flexible array membertypedef struct { int pn[2]; shm_conf c; } i_shm_conf; void fooo(int count) { struct asdf { shm_conf memory_conf; i_shm_conf is[]; } m; size_t sz = sizeof m + sizeof m.is[0] * count; }。这也避免了您的计算方法可能存在的对齐问题。

标签: c struct shared-memory mmap memcpy


【解决方案1】:

错误可能是memcpy调用中的指针算法。

memcpy(memory_conf + sizeof(shm_conf), process_numbers, sizeof(process_numbers));

memory_conf 已经是一个shm_conf 指针,因此它以sizeof(shm_conf) 递增。该行应更改为:

memcpy(memory_conf + 1, process_numbers, sizeof(process_numbers));

为了避免复制到未分配的内存中

【讨论】:

  • 是的,谢谢,它工作正常! :) 但是我怎样才能改变共享内存中的数组呢?这种类型转换不起作用:int proc_nr[count][2] = (int[][])(memory_conf + 1);
  • @BastiG。据我所知,C 根本不允许您转换为数组类型,但是,您可以执行类似 int proc_nr[count][2]; 然后 memcpy(&amp;proc_nr, memory_conf + 1, sizeof(int[count][2]); 之类的操作,这应该将整数值放入数组中
  • 是的,但是如果我这样做,共享内存中的值不会改变...
  • @BastiG。如果您想更改proc_nr 变量以更改共享内存中的值,您可能需要类似于int (*proc_nr)[count][2] = (memory_conf + 1); 的内容,那么您可以将proc_nr(共享内存)指向的数组更改为@ 987654333@
  • 谢谢!我有最后一个问题。我收到此作业 (*proc_nr)[count][2] = (memory_conf + 1);initialization from incompatible pointer type 警告。有没有警告的选项?
猜你喜欢
  • 2019-04-13
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多