ENUNCIADO

Esta segunda práctica consiste en un programa que admite el nombre de un fichero por la línea de órdenes de la shell. Esta práctica no es para entregar. Efectúa una proyección en memoria de dicho fichero y sustituye todas sus 'a' por 'o'. Deshace la proyección y cierra el fichero. Comprobación de errores no paranoica. ¿Qué habría que usar para hacer esto si no se dispusiera de ficheros proyectados en memoria en el sistema operativo? ¿Qué ventajas suponen estos ficheros?

COMENTARIOS

La práctica con 0.25 es la de Strauss:
#define _HPUX_SOURCE
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

int main ( int argc, char *argv[] ) {
    int archivo, tam_fich, i;
    char mensaje[80];
    char *buffer;

    if ( argc==1 ) {
        printf("Modo de uso:\n");
        printf("        visuol_mem  ARCHIVO\n");
        return 0; 
        /* Los errores, deberían ir por el canal de errores. 
           fprintf(stderr, ...);
           Además, el código de retorno 0 se reserva para ejecución
           con éxito */
        }

    archivo=open( argv[1], O_RDWR );
    if (archivo==-1) {  /* Eeecc */
        printf("Imposible abrir archivo.\n");
        /* ¡¡¡Los errores, deberían ir por el canal de erroress!!! */  
        sprintf(mensaje, "%s: abrir : %s\n",argv[0],argv[1]);
        perror(mensaje);
        return 1;
        }
        
    tam_fich=lseek (archivo, 0, SEEK_END);
    buffer=mmap (0, tam_fich , PROT_READ | PROT_WRITE , MAP_SHARED, archivo , 0);
    close (archivo); /* Bien: no hace falta mantenerlo abierto */  

    if (buffer==MAP_FAILED) {
        printf("Error de memoria");
        /* ¡¡¡Los errores, deberían ir por el canal de erroress!!! */  
        sprintf(mensaje, "%s: memoria : %s\n",argv[0],argv[1]);
        perror(mensaje);
        return 1;
        }

    for (i=0; i<tam_fich; i++ )
        if (buffer[i]=='a') buffer[i]='o';

    munmap (buffer, tam_fich);
    return 0;
}
   

MENCIONES ESPECIALES

Como nadie salvo dos grupos respondió a las preguntas de la práctica daremos las menciones especiales a estos grupos:
© 2000 Guillermo González Talaván.