/* MACHACA.C ========= Uso: machaca fichero tambloque nbloques nficheros [ventana] fichero = ruta del fichero de pruebas tambloque = tamaño de bloque físico nbloques = número de bloques físicos nficheros = máximo número de ficheros ventana = tamaño de la ventana para evaluar la localidad de las referencias a bloques físicos Parámetros que probará José Miguel: machaca fichero 500 1000 100 10 machaca fichero 500 1000 100 100 */ #include "errores.h" #include "sfbasico.h" #include "sffisico.h" #include #include #include #include int SALIR_SI_ERROR = 0; #define HECHO printf("hecho\n"); /* Funciones locales */ void prueba_lectura(WORD maxfich); void prueba_escritura(WORD* maxfich); int crea_fichero(int nfich); void lee_fichero(int nfich); void escribe_fichero(int nfich); WORD tam_fichero (int nf); const char* nombre_fichero(int nf); int lee_bloque (IFB ifb,int nf,int nb); int escribe_bloque (IFB ifb,int nf,int nb); void mensaje (const char* m,...); #include int contador=0; void muestra() { printf("contador=%d\n",contador); signal(SIGINT,muestra); } /**** MàDULO PRINCIPAL ****/ main (int argc,char* argv[]) { WORD tamblfis = atoi(argv[2]); DWORD numblfis = atol(argv[3]); WORD maxfich = atoi(argv[4]); char* args[3]; int ventana = atoi(argv[5]); if (ventana==0) ventana=25; /* Crea el disco y lo formatea */ printf("fabrico disco...");fflush(stdout); FabricaDisco(argv[1],tamblfis,numblfis); if (HAY_ERROR) { mensaje("no se pudo crear el disco"); exit(1); } else HECHO printf("formateo el disco..."); fflush(stdout); args[0]=argv[4]; args[1]="3"; args[2]=0; FormateaSFB(argv[1],args); if (HAY_ERROR) { mensaje("no se pudo formatear el disco"); exit(1); } else HECHO /* Monta el SF y crea varios ficheros */ MontaSFB(argv[1],ventana); printf("pruebas de creación y escritura...");fflush(stdout); prueba_escritura(&maxfich); HECHO printf("pruebas de lectura...");fflush(stdout); prueba_lectura(maxfich); HECHO DesmontaSFB(); /* Vuelve a montar el SF y hace una prueba de lectura */ MontaSFB(argv[1],ventana); printf("repito pruebas de lectura...");fflush(stdout); prueba_lectura(maxfich); HECHO /* borra alg£n fichero y vuelve a hacer la prueba */ printf("prueba de borrado selectivo...");fflush(stdout); { int nf = 13; IFB ifb = BuscaFB(nombre_fichero(nf)); DestruyeFB(ifb); ifb = BuscaFB(nombre_fichero(nf)); if (!HAY_ERROR && ifb!=NINGUN_IFB) { mensaje("Se permitió acceder al fichero borrado %d",nf); } crea_fichero(nf); } HECHO printf("comprobación de integridad tras el borrado...");fflush(stdout); prueba_lectura(maxfich); HECHO /* realiza lecturas aleatorias */ signal(SIGINT,muestra); printf("acceso aleatorio al disco...");fflush(stdout); { for (contador=0;contador<1000;contador++) { lee_fichero(((unsigned)rand())%maxfich); } } HECHO DesmontaSFB(); return 0; } /* main */ /* Prueba de creaci¢n y escrituras en ficheros */ void prueba_escritura(WORD* maxf) { int k; int maximo=*maxf; for (k=0;k<*maxf;k++) { int ok = crea_fichero(k); if (!ok) { maximo=k; break; } } /* Crea los restantes ficheros de longitud cero */ for (k=maximo;k<*maxf;k++) { IFB ifb = CreaFB(nombre_fichero(k),0); if (HAY_ERROR || ifb==NINGUN_IFB) { mensaje("no se pudo crear el fichero %s",nombre_fichero(k)); *maxf = maximo; return; } } *maxf = maximo; /* intenta escribir un fichero de m s */ { IFB nf = CreaFB(nombre_fichero(*maxf+1),0); if (!HAY_ERROR && nf!=NINGUN_IFB) { mensaje("se permiti¢ crear un fichero de m s"); } } } /* Prueba de lecturas de ficheros */ int crea_fichero (int k) { IFB ifb; if (EspacioLibre()