Notas sobre el mapeo de memoria

1. Si realiza una operación ++ (ptr++) en el valor de retorno (ptr) de mmap, ¿puede munmap tener éxito?
    Sí, pero no se recomienda.

2. ¿Qué pasará si se especifica O_RDONLY durante la apertura y se especifica PROT READPROT WRITE para el parámetro prot durante mmap?
    Error, se devuelve MAP_FAILED. Se recomienda que los permisos en la función open() sean consistentes con los permisos del prot parámetro.

3. ¿Qué sucede si el desplazamiento del archivo es 1000?
    Debe ser un múltiplo entero de 1024 y se devuelve MAP_FAILED.

4. ¿Bajo qué circunstancias fallará la llamada mmap?
    -La longitud del primer parámetro = 0
    -El tercer parámetro prot solo especifica el permiso de escritura


5. ¿Puede O_CREAT un nuevo archivo para crear un área de mapeo cuando está abierto?
    - Sí, pero si el tamaño del archivo creado es 0, definitivamente no funcionará
    - Puede extender el nuevo archivo
        -lseek()
        -truncate

6. ¿Cerrar el descriptor de archivo después de mmap tiene algún impacto en el mapeo de mmap?
    El área de mapeo todavía existe y el fd que creó el área de mapeo está cerrado, sin ningún impacto.

7. ¿Qué pasará si el ptr está fuera de los límites?
    Se producirá una falla de segmento.

Uso del mapeo de memoria para implementar la función de copia de archivos

    Idea:

        1. Mapa de memoria del archivo original.

        2. Crea un nuevo archivo y expándelo.

        3. Mapeo de memoria de archivos nuevos

        4. Copie los datos de la memoria del primer archivo a la nueva memoria del archivo mediante la copia de memoria.

        5. Liberar recursos

#include<stdio.h>
#include<sys/mman.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
int main() {
    //1
    int fd = open("english.txt", O_RDWR);
    //2.
    int fd1 = open("cpy.txt", O_RDWR | O_CREAT, 0664);
    int size = lseek(fd, 0, SEEK_END);
    truncate("cpy.txt", size);
    write(fd1, " ", 1);
    //3.
    void * ptr = mmap(NULL, size, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0);
    void * ptr1 = mmap(NULL, size, PROT_WRITE | PROT_READ, MAP_SHARED, fd1, 0);
    //4.
    memcpy(ptr1, ptr, size);
    munmap(ptr1, size);
    munmap(ptr, size);
    close(fd1);
    close(fd);
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/ME_Liao_2022/article/details/133243711
Recomendado
Clasificación