У меня есть структура А в форме, описанной ниже. Моя цель - создать структуру в одном процессе и поделиться ею с другим процессом. 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"));