Выделение указателей из существующей области разделяемой памяти - POSIX C API - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть структура А в форме, описанной ниже. Моя цель - создать структуру в одном процессе и поделиться ею с другим процессом. A-> buffer зависит от user_size и предоставленного значения, и, следовательно, я не могу иметь предварительно выделенный буфер. Зная, что совместное использование указателей с разделяемой памятью сложно для всех процессов, так как значение указателя в одном процессе больше не будет действительным в другом процессе, я попробовал следующий подход.

Я хотел выделить буфер из разделяемой памяти, из процесс записи, чтобы другие процессы могли отображаться в одну и ту же разделяемую память и получать действительный адрес указателя на разделяемую память.

Концептуально, вызов mmap для того же дескриптора fd разделяемой памяти должен указывать на то же место в разделяемой памяти памяти, однако в процессе чтения я могу получить действительный указатель и правильное другое_значение.

Может кто-нибудь уточнить это? Части кода ниже.

struct A {

 int another_variable;
 void *buffer;
}

/* the size (in bytes) of shared memory object */
const int SIZE = 4096;

/* name of the shared memory object */
const char *name = "OS";

/* shared memory file descriptor */
int shm_fd;

/* create the shared memory object */
shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666);

/* configure the size of the shared memory object */
ftruncate(shm_fd, SIZE);

a_data = mmap(NULL, sizeof(*A), PROT_READ | PROT_WRITE, MAP_SHARED,
        shm_fd, 0);


if (a_data == MAP_FAILED) {
    printf("ERROR: mmap failed for a_data\n");
    exit(EXIT_FAILURE);
}

a_data->buffer = mmap(NULL, user_size,  PROT_WRITE,
            MAP_SHARED , shm_fd, 0);

if (a_data->buffer == MAP_FAILED) {
    printf("ERROR: mmap failed for a_data buffer\n");
    exit(EXIT_FAILURE);
}

memcpy(a_data->buffer, "test", strlen("test"));
...