Poniżej znajduje się kod, którego używam do mmapowania pliku w Ubuntu z wawrzynami, ale to połączenie kończy się błędem "nieprawidłowy argument". Jednakże, gdy przekazuję flagę MAP_ANON bez parametru deskryptora pliku w mmap, to działa. Nie jestem w stanie zrozumieć możliwego powodu tego.Ubuntu 10.04, błąd w użyciu MAP_HUGETLB z MAP_SHARED
Po drugie, nie jestem w stanie zrozumieć, dlaczego plik mmaping jest dozwolony w MAP_PRIVATE, gdy ta sama flaga oznacza, że żadna zmiana nie zostanie zapisana z powrotem do pliku. Można to zawsze osiągnąć za pomocą MAP_ANON, czy jest coś, czego mi brakuje?
Czy ktoś może mi w tym pomóc?
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;
}
'int32_t main' jest błędem. Zgodnie ze standardem C++, typ powrotu 'main' i typ' argc' powinny być po prostu 'int'. –
larsmans, czy to ma wpływ na wyjście programu? Na mojej architekturze int jest takie samo jak int32_t, więc nie powinno to w ogóle mieć znaczenia. Ale ze standardowego punktu widzenia to nie w porządku, zgadzam się. (Wcześniej popełniłem jakiś błąd przy pisaniu tego komentarza) – Faraz
Faraz: Nie, on po prostu chwytał. – BjoernD