Ubuntu 10.04, ошибка при использовании MAP_HUGETLB с MAP_SHARED

Ниже приведен код, который я использую для отображения файла в ubuntu с огромными страницами, но этот вызов не работает с ошибкой «недопустимый аргумент». Однако когда я прохожу Флаг MAP_ANON без параметра дескриптора файла в mmap, тогда он работает. Я не могу понять возможную причину этого.

Во-вторых, я не могу понять, почему с помощью MAP_PRIVATE разрешено отображение файлов, когда сам этот флаг означает, что никакие изменения не будут записаны обратно в файл. Это всегда можно сделать с помощью MAP_ANON, или мне чего-то не хватает?

Может ли кто-нибудь помочь мне с этим?

int32_t main(int32_t argc, char** argv) {
int32_t map_length = 16*1024*1024; // 16 MB , huge page size is 2 MB
int32_t protection = PROT_READ | PROT_WRITE;
int32_t flags = MAP_SHARED | MAP_HUGETLB;
int32_t file__ = open("test",O_RDWR|O_CREAT | O_LARGEFILE,s_IRWXU | S_IRGRP | S_IROTH);
if(file__ < 0 ) {
    std::cerr << "Unable to open file\n";
    return -1;
}

if (ftruncate(file__, map_length) < 0) {
    std::cerr
    << "main :: unable to truncate the file\n"
    << "main :: " << strerror(errno) << "\n"
    << "main :: error number is " << errno << "\n";
    return -1;
}
void *addr= mmap(NULL, map_length, protection, flags, file__, 0);
if (addr == MAP_FAILED) {
    perror("mmap");
    return -1;
}
const char* msg = "Hello World\n";
int32_t len = strlen(msg);
memcpy(addr,msg,len);
munmap(addr, map_length);
close(file__);
return 0;
}
8
задан Fred Foo 4 July 2011 в 18:40
поделиться