As Adam Martin notes, смещения должны быть кратными размеру страницы. Но вы, вероятно, не нужны три отдельных 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);