Как я могу разделить одну общую память на 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
хотя я предполагаю, что вы ввели это опечатка, иначе ваш код не должен компилироваться.