<< >> Título

Sistema de ficheros simbólico


Esta práctica consiste en el desarrollo de una parte de un sistema de ficheros, concretamente se refiere a lo que hemos denominado Sistema de Ficheros Simbólico, en el que se soportan las siguientes funciones:

Crea_Sistema

Crea un sistema de ficheros
Activa_Sistema
Prepara al sistema de ficheros para ser accedido.
Crea_Fichero
Crea un archivo en un sistema de ficheros.
Abre_Fichero
Abre un archivo.
Lee_Fichero
Lee una ristra de bytes de un archivo.
Escribe_Fichero
Escribe una ristra de bytes en un archivo.
Posiciona_Puntero
Actualiza el puntero de acceso de un archivo.
Cierra_Fichero
Cierra un archivo.
Borra_Fichero
Borra un archivo

El conjunto de funciones anterior configuran la interfaz con el usuario, por tanto, en su desarrollo deberán estar contempladas como mínimo, se verá a medida que se avance en la exposición de la práctica que éstas además requerirán el apoyo de otras funciones que, o bien, se han de implementar en este nivel, o bien, forman parte del Sistema de Ficheros Básico, que proporciona servicios de gestión de bloques y ficheros sencillos (ver la siguiente práctica). Desde el punto de vista del usuario, el sistema de ficheros que se ha de diseñar posee las siguientes características:

1. Los archivos se identifican por una cadena de 12 caracteres.

2. Los archivos se organizan linealmente.

3. De cara al usuario, un archivo es visto como una cadena de bytes.

El módulo del sistema de ficheros que abarca esta práctica, Sistema Simbólico, será el responsable de soportar la visión del usuario anteriormente descrita y transformarla de manera que:

1. Los archivos se identifican por un identificador numérico del sistema, dícho identificador está asociado a una estructura de control que posee los atributos de los archivos, por tanto, en este nivel se llevarán a cabo la transformación de identificador simbólico en forma de cadena de cacarecteres (de usuario) a indentificador númerico del sistema.

2. Los archivos se constituyen como secuencia de bloques de datos de tamaño fijo.

Estructuras de control del Sistema de Ficheros Simbólico

Este nivel utilizará las siguientes estructuras de datos: bloque de control de fichero en disco, que llamaremos Bcfd, bloque de control de fichero en memoria, Bcfm, bloque de control de fichero de usuario, Bcfu, bloque de sistema de ficheros activo, Bsfa. Para cada una de las estructuras anteriores, se tendrá asociada una tabla, así se tendrán: con la estructura Bcfm se tendrá la Tabla de ficheros activos del sistema, Tfas, con la estructura Bcfu se tendrá la Tabla de ficheros de usuario, Tfu, y por último, con la estructura Bsfa se tendrá la Tabla de sistemas de ficheros activos, Tsfa. Seguidamente se pasa a describir la información contenida en cada una de las estructuras de control mencionadas.

El Bcfd

Se trata de la estructura de control que todo archivo en nuestro sistema debe poseer, se corresponde con lo que en la bibliografía se denomina entrada de directorio (en DOS), inode (en UNIX), etc. Mediante esta estructura el sistema podrá manipular los datos pertenecientes a los ficheros, internamente contiene la siguiente información:

- Nombre del archivo: 12 caracteres pertenecientes a [a ... z, A ... Z].

- Fecha de creación/modificación: 3 caracteres asociados a año (a partir de 1900, mes y día.

- Hora de creación/modificación: 3 caracteres asociados a hora, minuto, segundo.

- Tamaño: 4 bytes sin signo.

- Atributo de acceso: 1 byte que especifica si es de sólo lectura o sólo escritura.

- Dirección de bloques de datos: 40 bytes que localizan los bloques de datos del archivo.

Asociada a la estructura Bcfd se tendrá el directorio del sistema (que será el único existente pues los archivos se organizan en un sólo nivel) formado por un número dado de elementos del tipo Bcfd, el número específico de entradas de este tipo que se tienen para un sistema de ficheros se establece en el momento de la creación de éste (función Crea_Sistema).

El Bcfm

Se trata de una estructura que todo fichero activo (sobre el que se ha realizado al menos una operación de apertura) tiene asociado, contiene la imagen actualizada en memoria de la estructura Bcfd descrita anteriormente e información adicional necesaria para manipular el archivo mientras esté activo. Concretamente esta estructura contiene la siguiente información:

- Índice al directorio del sistema donde se encuentra su Bcfd: 2 bytes sin signo.

- Imagen actualizada del Bcfd: tamaño en bytes de la estructura Bcfd.

- Número de referencias: 1 byte sin signo.

- Flag de bloqueo: 1 byte

Asociada a la estructura Bcfm se tiene la tabla de ficheros activos del sistema, Tfas, que consiste en un conjunto de entradas del tipo Bcfm, cuyo número, MAX_TFAS, es una constante del sistema definida en el fichero Consta_SF.h que se proporcionará como apoyo para el desarrollo de la práctica. Cuando se abre por primera vez un fichero, entonces se asigna una entrada de la Tfas, cuando se cierra un fichero y además el contador de referencias del fichero cerrado es 1, entonces es cuando se libera la entrada asociada al fichero cerrado.

El Bcfu

Se trata de una estructura que todo que usuario que ha realizado una operación de apertura de un fichero (función Abre_Fichero) posee en su área de memoria, contiene la siguiente información:

- Índice a la entrada en la Tfas que el fichero tiene asociada: 2 bytes sin signo.

- Copia de los atributos de acceso: 1 byte.

- Puntero de acceso al fichero: 4 bytes sin signo.

Asociada a esta estructura se tiene la Tabla de ficheros de usuario, Tfu, que está constituida por un conjunto de entradas del tipo Bcfu, el número de estas entradas, MAX_TFUS, es una constante del sistema definida en Consta_S.h . Por cada operación de apertura realizada sobre un fichero se tendrá una entrada del tipo Bcfu en la tabla que el usuario que realizó la operación posee. Cuando se ejecuta un cierre de fichero por parte de un usuario (Cierra_Fichero) se libera la entrada asociada al fichero cerrado.

El Bsfa

Lo utiliza el sistema para controlar los sistemas de ficheros activos (sobre los que se han ejecutado una operación de Activa_Sistema), teniendo cada uno de ellos un Bsfa asociado

Interfaz del Sistema de Ficheros Simbólico

Las funciones utilizadas por el SFS se pueden clasificar en tres tipos:

* Funciones de interfaz con el usuario.

* Funciones de uso interno.

* Funciones de interfaz con el Sistema de Ficheros Básico.

Las primeras son las que vamos a describir en este apartado y son aquellas que pueden ser invocadas directamente por el usuario desde la línea de órdenes de la aplicación a desarrollar. Las segundas son invocadas por la funciones anteriores y sirven para efectuar ciertas tareas elementales del SFS, la definición de tales tareas y la forma de implementarlas es un aspecto importante a resolver por los diseñadores y diseñadoras de esta práctica.

Por último, las funciones de interfaz con el nivel inferior más cercano al SFS, el Sistema de Ficheros Básico (SFB en adelante) pertenecen a este último y se han de conocer a nivel funcional (como cajas negras) por los diseñadores y diseñadoras de esta práctica, puesto que son los puntos de entrada al resto del sistema de ficheros. Habrán de consultar la definición de estas funciones, que se halla a partir de la página 25.

Seguidamente pasamos a describir la interfaz del sistema de ficheros simbólico.

Crea_Fichero Crea un fichero

#include "Consta_SF.h"

#include "Tipos_SF.h"

#include "Error_SF.h"

int Crea_Fichero (Nombre *nomb, Atributo atrib);

Crea_Fich crea un fichero, cuyo nombre está contenido en una cadena de caracteres apuntada por nomb, y con atributos de acceso especificados por el parámetro atrib, dichos atributos se encuentran definidos en el archivo cabecera Consta_SF.h y son: LECTURA y ESCRITURA. Si la función tiene éxito, entonces retornará 0, en caso contrario, retornará -1 y la variable global Error_SF tomará alguno de los valores siguientes:

ERR_INACTIVO Sistema de ficheros no activo

ERR_EXISTE Fichero ya existente.

ERR_MAXFICH Todas las entradas de directorio ya están asignadas.

ERR_EATRIBUTO Especificación de atributo inválida.

ERR_PARAMETRO Nombre inválido

Borra_Fichero Borra un fichero

#include "Consta_SF.h"

#include "Tipos_SF.h"

#include "Error_SF.h"

int Borra_Fichero(Nombre *nomb);

Borra_Fichero borre un fichero, cuyo nombre está contenido en una cadena de caracteres apuntada por nomb. Si la función tiene éxito, entonces retornará 0, en caso contrario, retornará -1 y la variable global Error_SF tomará alguno de los valores siguientes:

ERR_INACTIVO Sistema de ficheros no activo

ERR_NOEXIST Fichero ya existente.

ERR_ACCESO Fichero abierto o sólo lectura.

ERR_PARAMETRO Nombre inválido.

Abre_Fich Abre un archivo

#include "Consta_SF.h"

#include "Tipos_SF.h"

#include "Error_SF.h"

int Abre_Fich(Nombre *nomb, Acceso acces);

Abre_Fichero realiza una apertura de un fichero, cuyo nombre se especifica mediante nomb, para ser accedido según el modo especificado por el parámetro acces, los modos de acceso básicos permitidos son:

LECTURA Lectura.

ESCRITURA Escritura.

BLOQUEO Apertura con bloqueo.

También se permiten combinaciones de los modos anteriores mediante el uso del operador | (OR), por ejemplo: LECTURA | BLOQUEO (apertura para accesos sólo lectura con bloqueo) o LECTURA | ESCRITURA (apertura para accesos de lectura y escritura). Si la función se ejecuta con éxito, entonces retornará un valor entero no negativo que se corresponde con el índice a una entrada en la Tfu que se ha asociado al archivo abierto como consecuencia de la ejecución sin error. Si se produce un error durante la ejecución de esta función, entonces retornará -1 y la variable global Error_SF tomará alguno de los siguientes valores:

ERR_INACTIVO Sistema de ficheros no activo

ERR_NOEXISTE Fichero no existente.

ERR_RANGO Tablas del sistema llenas.

ERR_ACCESO Tipo de acceso inválido o no permitido.

Posiciona_Puntero Actualiza el puntero de fichero para un próximo acceso

#include "Consta_SF.h"

#include "Tipos_SF.h"

#include "Error_SF.h"

int Posiciona_Puntero(int fd, Posfich punt);

Posiciona_Puntero actualiza el valor de puntero de acceso del archivo referenciado por fd a la posición indicada por el parámetro punt. Si la función se ejecuta sin error, entonces devolverá un valor no negativo igual a punt, en cambio si un error ocurre, entonces devolverá -1 y la variable global del sistema Error_SF tomará alguno de los valores siguientes:

ERR_INACTIVO Sistema de ficheros no activo

ERR_EFD Descriptor de fichero inválido.

ERR_PUNTERO Valor de puntero inválido.

Escribe_Fichero Escribe una cadena de bytes en un fichero

#include "Consta_SF.h"

#include "Tipos_SF.h"

#include "Error_SF.h"

int Escribe_Fichero(int fd, void *buff, int nbytes);

Escribe_Fichero transfiere nbytes desde la posición apuntada por buff al fichero asociado al descriptor de fichero fd, los bytes escritos se ubicarán a partir de la posición indicada por el valor actual del puntero del fichero y el puntero a fichero se incrementará en un valor de nbytes. Si la función se ejecuta con éxito, entonces retornará un valor entero positivo igual a nbytes, en caso contrario retornará -1 y la variable global Error_SF tomará alguno de los siguientes valores:

ERR_INACTIVO Sistema de ficheros no activo

ERR_EFD Descriptor de fichero inválido.

ERR_ACCESO Acceso no permitido.

ERR_ESCRIBE Error en la escritura del fichero.

ERR_ESPACIO No puede crecer más el fichero

Lee_Fichero Lee una cadena de bytes en un fichero.

#include "Consta_SF.h"

#include "Tipos_SF.h"

#include "Error_SF.h"

int Lee_Fichero(int fd, void *buff, int nbytes);

Lee_Fichero transfiere nbytes desde el fichero asociado al descriptor de fichero fd a la posición de memoria apuntada por buff, los bytes se leerán a partir de la posición indicada por el valor actual del puntero del fichero. Si la función se ejecuta con éxito, entonces retornará un valor entero positivo igual al número de bytes leidos y el puntero del fichero se incrementará en dicho número de bytes, en caso contrario retornará -1 y la variable global Error_SF tomará alguno de los siguientes valores:

ERR_INACTIVO Sistema de ficheros no activo

ERR_EFD Descriptor de fichero inválido.

ERR_ACCESO Acceso no permitido.

ERR_LEE Error en la lectura del fichero.

Cierra_Fichero Cierra un archivo

#include "Consta_SF.h"

#include "Tipos_SF.h"

#include "Error_SF.h"

int Cierra_Fichero( int fd );

Cierra_Fichero cierra el fichero referenciado por fd, procediéndose a actualizar tanto los datos como la información de control de memoria a disco. Si la función se ejecuta con éxito, entonces retornará 0, en cambio si un error se produce devolverá -1 y la variable global Error_SF podrá tomar uno de los siguientes valores:

ERR_INACTIVO Sistema de ficheros no activo

ERR_EFD Descriptor de fichero inválido

Crea_Sistema Crea un sistema de ficheros

#include "Consta_SF.h"

#include "Tipos_SF.h"

#include "Error_SF.h"

int Crea_Sistema(char *nomb, u_short nbloq, u_short tbloq, u_short nfich);

Crea_Sistema construye un sistema de ficheros en el archivo cuyo nombre se especifica mediante nomb. El parámetro nbloq indica el número de bloques de sistema de ficheros, tbloq especifica la longitud del cada bloque y nfich especifica el número de entradas de ficheros del directorio del sistema a crear. Si la función se ejecuta con éxito, entonces devolverá 0, en caso contrario, retornará -1 y la variable global Error_SF tomará alguno de los valores siguientes:

ERR_FICHERO Error fichero inválido.

ERR_PARAMETRO Parámetro inválido.

Activa_Sistema Activa un sistema de ficheros

#include "Consta_SF.h"

#include "Tipos_SF.h"

#include "Error_SF.h"

int Activa_Sistema( char *nomb, int nbloques_cache );

Activa_Sistema activa un sistema de ficheros contenido en el archivo cuyo nombre se especifica mediante nomb y que fue creado previamente por Crea_Sistema. El parámetro nbloques_cache indica cuántos bloques se desean para la caché.

Si la función se ejecuta con éxito, entonces devolverá el índice a la tabla de sistemas de ficheros activos asignado, en caso contrario, retornará -1 y la variable global Error_SF tomará alguno de los valores siguientes:

ERR_FICHERO Error fichero inválido.

ERR_RANGO Alcanzado límite de Sistemas de ficheros activos.

Desactiva_Sistema Activa un sistema de ficheros

#include "Consta_SF.h"

#include "Tipos_SF.h"

#include "Error_SF.h"

int Desactiva_Sistema( );

Desactiva_Sistema desactiva el sistema de ficheros que actualmente está activo.

Si la función se ejecuta con éxito, entonces devolverá 0, en caso contrario, retornará -1 y la variable global Error_SF tomará alguno de los valores siguientes:

ERR_INACTIVO No hay sistema de ficheros activo.

InformeSFS Imprime un informe sobre el sistema

#include "Consta_SF.h"

#include "Tipos_SF.h"

#include "Error_SF.h"

void InformeSFS (void);

InformeSFS imprime en la salida estándar un informe con las estadísticas y estado general del Sistema de Ficheros Simbólico.

Esta función no devuelve nada y no produce ningún error.


<< >> Título