简体   繁体   English

为什么给共享内存中的memcpy分段错误

[英]Why gives memcpy in shared memory a segmentation fault

i have a problem with my current project. 我当前的项目有问题。

Here my header: 这是我的标题:

#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;

And here my code: 这是我的代码:

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));

I want to store a two dimensional array after the shm_conf struct. 我想在shm_conf结构之后存储一个二维数组。 But memcpy gives me a segmentation fault and i don't know why, can you help me? 但是memcpy给我一个细分错误,我不知道为什么,你能帮我吗?

After this array i want store another array, this is why shm_size is bigger than i need currently. 在此数组之后,我想存储另一个数组,这就是为什么shm_size大于我当前需要的原因。

The error may be the pointer arithmetic in the memcpy call. 该错误可能是memcpy调用中的指针算法。

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

memory_conf is already an shm_conf pointer so it increments by sizeof(shm_conf) . memory_conf已经是一个shm_conf指针,因此它以sizeof(shm_conf)递增。 That line should be changed to: 该行应更改为:

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

To avoid copying into memory that's not been allocated 为了避免复制到未分配的内存中

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM