Почему Memcpy в общей памяти ошибка сегментации - PullRequest
0 голосов
/ 03 мая 2018

У меня проблема с моим текущим проектом.

Вот мой заголовок:

#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 больше, чем мне нужно в данный момент.

1 Ответ

0 голосов
/ 03 мая 2018

Ошибка может быть арифметикой указателя в вызове 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));

Чтобы избежать копирования в память, которая не была выделена

...