es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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]

Tags:  , , , ,

Answer

  1. Avatar for 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:

    1. Comprobar si el archivo existe y se puede abrir utilizando operaciones estándar de E/S de archivos. Si hay un error al intentar abrir el archivo, puede indicar un problema de permisos o acceso.
    2. Comprobar el valor de la variable FileName y asegurarse de que apunta a la ubicación correcta del archivo.

    3. 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().

    4. 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.

    5. Intentar ejecutar el programa con privilegios elevados para ver si se resuelve el problema.

    6. 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.

Comments are closed.