Página siguiente Página anterior Índice general

2.1 Entrada/salida básica

Objetivos

Comprender las operaciones básicas de entrada/salida de un Unix y ver algunos aspectos sobre la eficiencia.

Especificación

  1. Estúdiese las operaciones open, read, write, close y exit y estudie y ejecute esta versión simplificada del programa cp, de copia de ficheros, que toma como parámetros un fichero origen y uno destino, solamente. Note que si el fichero destino existe, es reemplazado, y si su tamaño era mayor, es acortado.

    /* cpsimple.c */
    
    #define TAMANO 1024
    
    #include <unistd.h>
    #include <fcntl.h>
    #include <string.h>
    
    char buf[TAMANO];
    
    static void error(char* mensaje) {
       write(2, mensaje, strlen(mensaje));
       exit(1);
    }
    
    int main(int argc, char* argv[]) {
        int leidos, escritos, origen, destino;
    
        if (argc != 3) 
           error("Error en argumentos\n");
        if ((origen = open(argv[1], O_RDONLY)) < 0) 
           error("Error en origen\n");
        if ((destino = open(argv[2], O_CREAT | O_WRONLY | O_TRUNC, 0644)) < 0)
           error("Error en destino\n");
        while ((leidos = read(origen, buf, TAMANO)) > 0)
           escritos = write(destino, buf, leidos);
        if (leidos < 0 ) 
           error("Error en lectura\n");
        exit(0);
    }
    
    

  2. Verifique que el núcleo guarda en su cache las últimas lecturas. Para ello realice dos copias sucesivas del mismo fichero a /dev/null y determine el número de octetos por segundo transferidos en ambas copias. Utilice un fichero suficientemente grande para que la medida sea significativa y lo suficientemente pequeño para que quepa en la cache (por ejemplo /usr/bin/emacs).
  3. Espíe el funcionamiento del programa a nivel de llamadas al sistema con strace.
  4. Cambie la rutina error por lo siguiente, que utiliza una rutina de biblioteca, en lugar de una llamada directa al núcleo. Verifique que funcionan de forma similar y las trazas son equivalentes.

    #include <stdio.h>
    
    static void error(char* mensaje) {
       fprintf(stderr, "%s", mensaje);
       exit(1);
    }
    


Página siguiente Página anterior Índice general