Comprender las operaciones básicas de entrada/salida de un Unix y ver algunos aspectos sobre la eficiencia.
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);
}
/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
).
strace
.
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);
}