Я пытаюсь запустить следующую программу на Ubuntu, но он сбой сегментации.SIGSEGV при вызове mmap дважды
То, что я пытаюсь сделать, это вызов ММАП дважды:
p1 = mmap(null, size: 16 * 4k, offset: 0);
p2 = mmap(p1+(16*4K), 136 * 4k , offset: 16 * 4k);
В основном, пытаясь создать два последовательных областей памяти зеркального отображения двух последовательных областей в файле. Это нормально, если 2-й mmap не удался, но я хотел бы понять, почему он вызывает ошибку сегментации.
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
int main()
{
int fd, ret;
void* p1;
void* p2;
unlink ("test.file");// don't care if it doesn't exists
fd = open("test.file", O_RDWR | O_CREAT | O_SYNC, ALLPERMS);
if(fd == -1)
return errno;
ret = ftruncate(fd, 4096*16);
if(ret != 0)
return errno;
p1 = mmap(NULL, 4096*16, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if(p1 == (void*)-1)
return errno;
ret = ftruncate(fd, 4096*150);
if(ret != 0)
return errno;
// dies here!
p2 = mmap(p1 + (4096*16), 4096*(150-16), PROT_READ | PROT_WRITE, MAP_SHARED |MAP_FIXED, fd, 4096*16);
if(p2 == (void*)-1)
return errno;
return 0;
}
Привет, Максим, большое спасибо, можете ли вы указать мне некоторые ресурсы, чтобы получить дополнительную информацию об этом? –
@AyendeRahien Я смог воспроизвести его, но не более с исходным кодом. Может быть рандомизация случайного пространства. –