sisoputnfrba / foro

Foro de consultas para el trabajo práctico
151 stars 7 forks source link

Al hacer msync no se modifica mi bitmap.bat #4106

Closed zakerik10 closed 4 months ago

zakerik10 commented 4 months ago

Buenas, estoy haciendo una función que se va a encargar de levantar el bitmap. Si no existe lo crea y demás Hasta ahí todo bien, pero al momento de querer setear algún bit por ejemplo, no se modifica nada en el archivo

Primero abro o creo el archivo bitarray.bat, lo trunco según la cantidad de bloques que voy a tener, genero un puntero del archivo con mmap(), seteo todos los bits en 0, creo un bitarray y cierro el archivo

Mas adelante, pruebo hacer un bitarray_set_bit para ver si esta todo funcionando y después msync

Pero dentro de mi archivo bitmap.dat no se ven los cambios Para verlo, abro el archivo con lectura hexa

void initializeFileBitarray() {
    printf("Creando FileBitmap\n");

    int fd_bitarray = open(path_bitmap, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
    if (fd_bitarray == -1) {
        printf("No se pudo abrir/crear el archivo bitmap.dat\n");
        return;
    }

    size_t blockCountInBytes = getValue(BLOCK_COUNT) / 8; 

    if (ftruncate(fd_bitarray, blockCountInBytes + 1) == -1) {
        printf("Error al establecer el tamaño del archivo bitmap.dat\n");
        close(fd_bitarray);
        return;
    }

    bitmapPointer = mmap(NULL, blockCountInBytes, PROT_READ | PROT_WRITE, MAP_SHARED, fd_bitarray, 0);
    if (bitmapPointer == MAP_FAILED) {
        printf("Error al mapear el archivo bitmap.dat en memoria\n");
        close(fd_bitarray);
        return;
    }

    memset(bitmapPointer, 0, blockCountInBytes);

    bitarray = bitarray_create_with_mode(bitmapPointer, blockCountInBytes, LSB_FIRST);
    if (!bitarray) {
        printf("Error al asignar memoria para el objeto bitarray\n");
        munmap(bitmapPointer, blockCountInBytes);
        close(fd_bitarray);
        return;
    }
    if (msync(bitmapPointer, bitarray->size, MS_SYNC) == -1) {
        printf("Error en la sincronización con msync()\n");
    }

    close(fd_bitarray);

    // Aca pruebo hacer asignaciones, aunque esto aca no tendria que estar
    for (int i = 0; i < 8; i++) {
        assignBlock(i);
    }
}

Y aca la funcion assignBlock()

void assignBlock(int blockIndex) {
    if (bitarray == NULL || bitarray->bitarray == NULL) {
        printf("El bitmap no está inicializado correctamente\n");
        return;
    }

    bitarray_set_bit(bitarray, blockIndex);

    if (msync(bitarray->bitarray, bitarray->size, MS_SYNC) == -1) {
        printf("Error en la sincronización con msync()\n");
    }
}

Después de ejecutar todo, todo el archivo bitmap.dat sigue todo en 0

zakerik10 commented 4 months ago

Me acabo de dar cuenta, justo después de mandar el issue, que al cerrar el archivo bitmap.dat, y volver a abrirlo, se reflejaban los cambios.

Eso es normal que sea asi, no? Por que por ejemplo probe por un momento que en vez de usar bitarray_set_bit, lo hacia por escritura directa, con write, y asi si modificaba el archivo, incluso con el archivo abierto.

iago64 commented 4 months ago

Buenas! Cómo va?

El llamado msync() lo que hace es decirle al programa que sincronice los cambios, pero si por ejemplo van abriendo el archivo con los comandos de consola xxd o hexdump cada tanto van a ver que los cambios se reflejan en lugar de tener que volver a abrirlo.

Saludos.-

zakerik10 commented 4 months ago

Okey, yo abria el .bat desde el mismo Visual Gracias.

iago64 commented 4 months ago

Buenas! Cómo va?

Claro, nosotros vamos a usar hexdump o xxd para ver el contenido de los archivos, no se olviden que las pruebas se corren en la VM sin interfaz gráfica.

Saludos.-

zakerik10 commented 4 months ago

Entiendo, gracias por la respuesta. Cierro issue.