El siguiente es el código que estoy usando para mmaping un archivo en ubuntu con hugepages, pero esta llamada falla con el "argumento inválido". Sin embargo, cuando paso indicador MAP_ANON sin parámetro de descriptor de archivo en mmap, entonces funciona. No puedo entender la posible razón detrás de esto.Ubuntu 10.04, error al usar MAP_HUGETLB con MAP_SHARED
En segundo lugar, no puedo entender por qué se permite mmaping de archivos con MAP_PRIVATE cuando esta bandera en sí misma significa que no se escribirá ningún cambio en el archivo. Esto siempre se puede lograr usando MAP_ANON, o hay algo que me falta?
¿Alguien me puede ayudar con esto?
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' es un error. Según el estándar de C++, el tipo de retorno de 'main' y el tipo de' argc' deberían ser ambos '' int'. –
larsmans, ¿eso afecta la salida del programa? En mi arquitectura, int es igual que int32_t, por lo que no debería importar nada. Pero desde el punto de vista estándar no está bien, estoy de acuerdo. (Anteriormente cometí un error al escribir este comentario) – Faraz
Faraz: No, él solo estaba curioseando. – BjoernD