Capítulo 17. Entrada/salida proyectada en memoria virtual

Tabla de contenidos
17.1. Objetivos
17.2. Documentación de las transparencias
17.3. Requisitos
17.4. Entrada/salida secuencial por memoria virtual
17.5. E/S aleatoria
17.6. Ficheros ofrecidos
17.7. Resultados pedidos

17.1. Objetivos

Comprender el acceso a ficheros vía memoria virtual.


17.2. Documentación de las transparencias

Las transparencias relevantes para realizar esta práctica son:

- Páginas 36-39 de las transparencias de Bibliotecas de C y llamadas al sistema


17.3. Requisitos

Las otras prácticas de entrada/salida de ficheros.


17.4. Entrada/salida secuencial por memoria virtual

Estudie y verifique este programa (cpmm.c), que realiza la copia de ficheros asignándolos a direcciones virtuales:




#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <errno.h>
#include <locale.h>

static char *p;

static void uso(void) { fprintf(stderr, "Uso:\n    %s origen destino\n", p); exit(1); }

static void error(char* mensaje) {
   int err = errno;
   perror(p);
   fprintf(stderr, "%s", mensaje);
   exit(err);
}

int main(int argc, char* argv[]) {
    off_t longitud, l;
    struct stat fileinfo;
    int origen, destino;
    caddr_t zona1, zona2;
    char *p1, *p2;

    p = argv[0];
    if (argc != 3) uso();
    setlocale(LC_ALL, ""); /* Mensajes de error en idioma local */
    if ((origen = open(argv[1], O_RDONLY)) < 0) 
       error("Error en origen\n");
    if ((destino = open(argv[2], O_CREAT 
                               | O_RDWR 
                               | O_TRUNC, 0666)) < 0)
       error("Error en destino\n");
    if (fstat(origen, &fileinfo) == -1)
       error("Error en origen\n");
    longitud = fileinfo.st_size;
    if (ftruncate(destino, longitud) == -1)
       error("Error al truncar\n");
    if ((zona1 = mmap(0, longitud, PROT_READ, MAP_PRIVATE, 
                      origen, (off_t)0)) == (caddr_t)(-1)) 
                         error("Error al proyectar origen\n");
    if ((zona2 = mmap(0, longitud, PROT_WRITE, MAP_SHARED, 
                      destino, (off_t)0)) == (caddr_t)(-1)) 
                         error("Error al proyectar destino\n");
    p1 = (char *)zona1; p2 = (char *)zona2;
    for (l = 0; l < longitud; l++) 
        *(p2++) = *(p1++);
    exit(0);
}




17.5. E/S aleatoria

Cuando verdaderamente es útil la entrada/salida por memoria virtual es en el acceso aleatorio. Haga versiones de los programas pedidos en la práctica de E/S aleatoria: leepos y escpos.


17.6. Ficheros ofrecidos

En el directorio es_mmap:


17.7. Resultados pedidos