Boost – mapear un archivo en memoria para lecturas y escrituras
Estoy tratando de mapear una región de un tamaño particular en la memoria, mirando el ejemplo de la documentación:
https://www.boost.org/doc/libs/1700/doc/html/interprocess/sharedmemorybetweenprocesses.html#interprocess.sharedmemorybetweenprocesses.mapped_file
como puedes observar, la versión de boost es 1.70.0
using namespace boost::interprocess;
const char *FileName = "c_e_d.bin";
const std::size_t FileSize = 10000;
file_mapping::remove(FileName);
std::filebuf fbuf;
auto p = fbuf.open(FileName, std::ios_base::in | std::ios_base::out
| std::ios_base::trunc | std::ios_base::binary);
//Establecer el tamaño
auto r = fbuf.pubseekoff(FileSize-1, std::ios_base::beg);
auto r2 = fbuf.sputc(0);
//Crear un archivo de mapeo
file_mapping m_file(FileName, read_write);
//Mapear el archivo completo con permisos de lectura y escritura en este proceso
mapped_region region(m_file, read_write);
pero ocurre una excepción:
[imagen]
No necesito la funcionalidad padre-hijo, solo varios threads escribiendo directamente en una región de memoria mapeada.
¿Alguien puede ayudarme a resolver esto por favor?
Gracias de antemano.
Información adicional de depuración:
Parece que se creó p de la siguiente manera:
[imagen]
También parece que las dos operaciones siguientes funcionaron:
[imagen]
[imagen]
davy.ai
Parece que la excepción se produce al intentar crear el objeto file_mapping. Una posible razón para esto podría ser que el archivo especificado en la variable FileName no exista o no se pueda acceder a él. Otra posible razón podría ser que el archivo ya exista, pero no tenga los permisos adecuados para ser abierto o mapeado.
Para depurar este problema más a fondo, puedes seguir los siguientes pasos:
Comprobar el valor de la variable FileName y asegurarse de que apunta a la ubicación correcta del archivo.
Intentar eliminar cualquier mapeo de archivo creado previamente y asegurarse de que el archivo no esté siendo utilizado por otros procesos. Esto se puede hacer utilizando el método file_mapping::remove().
Comprobar si hay algún software antivirus o de seguridad en ejecución que pueda estar impidiendo el acceso al archivo o bloqueando las operaciones mmap.
Intentar ejecutar el programa con privilegios elevados para ver si se resuelve el problema.
Utilizar una biblioteca o método diferente para la asignación de memoria si el problema no se puede resolver con Boost.
En general, es importante asegurarse de que el archivo que se va a mapear en memoria sea accesible, tenga los permisos adecuados y no esté siendo utilizado por otros procesos. Si aún tienes problemas con la asignación de memoria, puedes consultar la documentación de Boost o buscar ayuda en la comunidad en línea.