Как я могу разделить одну общую память на 3 разных размера указателей mmap в C?

Если у меня есть один сегмент общей памяти размером 1024, как мне отобразить его три разных размера? Я попробовал следующее, но получил ошибку сегмента. Я думаю, что-то не правильно выровнено, но я не могу выделить где.

fd = shm_open(NAME, FLAGS, MODE);
ftruncate(fd, 1024);
addr0 = mmap(NULL, 50, PROTS, FLAGS, fd, 0);
addr1 = mmap(NULL, 100, PROTS, FLAGS, fd, 50);
addr2 = mmap(NULL, 874, PROTS, FLAGS, fd, 150);

2 ответа

Решение

Как отмечает Адам Мартин, смещения должны быть кратны размеру страницы. Но вам, вероятно, не нужно три отдельных mmapс, и мог просто mmap один раз и использовать указатели на разные смещения этого одиночного отображения:

fd = shm_open(NAME, FLAGS, MODE);
ftruncate(fd, 1024);
addr0 = mmap(NULL, 1024, PROTS, FLAGS, fd, 0);
addr1 = (void*)((char*)addr0 + 50);
addr2 = (void*)((char*)addr1 + 100);

Просто не забудьте только позвонить munmap на addr0 (в этот момент все три указателя становятся недействительными). Или вы mmap от одной и той же начальной точки три раза, и отрегулируйте каждый указатель индивидуально (что позволит вам munmap каждое значение в отдельности, просто убедитесь, что это делается для исходного указателя, а не для настроенного указателя):

fd = shm_open(NAME, FLAGS, MODE);
ftruncate(fd, 1024);
addr0 = mmap(NULL, 50, PROTS, FLAGS, fd, 0);
char *const baseaddr1 = mmap(NULL, 150, PROTS, FLAGS, fd, 0);
char *const baseaddr2 = mmap(NULL, 1024, PROTS, FLAGS, fd, 0);
addr1 = (void*)(baseaddr1 + 50);
addr2 = (void*)(baseaddr2 + 150);

Ваше смещение (последний аргумент mmap) должен быть кратным размеру страницы man. Также fruncate должно быть ftruncateхотя я предполагаю, что вы ввели это опечатка, иначе ваш код не должен компилироваться.

Другие вопросы по тегам