Sistema de ficheros I 1 ENTORNO DE PROGRAMACIÓN EN GNU/LINUX Existen gran número de lenguajes de programación que se pueden utilizar: El más habitual es el C/C++ pues la mayor parte el propio S.O. está escrita en este lenguaje sólo una pequeña parte del núcleo está en ensamblador (la parte dependiente del procesador y parte de los controladores de dispositivos ) Herramientas • gcc : es el compilador de C desarrollado por GNU (cc), g++ en C++ Incluye Preprocesador cpp genera .i Compilador cc1 genera .s Ensamblador as genera .o Enlazador ld genera ejecutables Cada uno puede ir por separador todos invocador por gcc Fichero ejecutable por omisión es a.out, para ejecutar un archivo debe estar en el PATH su camino o indicarselo ./a.out • Uso de librerías ( Conjunto de funciones y Estructuras de datos ) Ficheros .a librerías conjunto de archivos .o (ar) Existen multitud de librerías para utilizar a parte de las estándares ncurses, X windows, OpenGL, conectarse con BD, Podemos crear nuestras propias librerías - Librerías estáticas : El código se incluye en el ejecutable - Librerías dinámicas (share) : No se integra, se copia a memoria cuando se utilice, sólo se carga una vez aunque la usen varios procesos. Ejecutables + pequeños, puede cambiar la librería sin tener que recompilar los ejecutables. • make Un proyecto escrito de programación puede estar formado por decenas de archivos C y librerías, no siempre la modificación de un archivo implica recompilar todo el proyecto, depende de la dependencias, los otros ficheros que usan o llaman ese módulo, el comando make, permite realizar las operaciones que sean necesarias compilar, borrar , enlazar según las dependencias que hayamos indicado en un fichero ( Makefile ), funciona en base a las fechas de actualización de cada archivo Esquema básico Objetivo : dependencias Acciones • gdb , Depurador de GNU, buscar y detectar el errores (opción –g) Seguimiento, paso a paso, punto de parada, preguntar por el valor de variables, remota, postmortem (core), en tiempo real (captura un proceso), modificar el valor de variables Sistema de ficheros I Existen entornos visuales donde se integran todas las herramientas, por menús. LLAMADAS AL SISTEMA Arquitectura del Sistema Operativo • • • Núcleo del sistema operativo: kernel Programas de Sistema ( shell, cc, X, mkfs, init, getty, telnet ) Programas de Aplicación (Oracle, xclock, netscape, openoffice) 2 Sistema de ficheros I 3 Sistema de ficheros I 4 Concepto Son las puertas de acceso a los servicios que ofrece el sistema operativo. Son una especie de llamada a un procedimiento, que se realiza mediante una interrupción software que cambia el entorno ejecución del proceso de modo de Usuario a modo Sistema (kernel) lo que permite el acceso libre a todos los recursos del ordenador. El proceso sólo podrá ejecutar el código de la llamada al sistema. Un proceso en modo usuario no se puede salir de madre, ni realizar libremente operaciones no permitidas, lo que no pasa en MS-DOS o en las primeras versiones de Windows. La existencia de un modo protegido o sistema permite una mayor protección ante fallos de las aplicaciones de usuarios y programas malintencionados (Ej.- virus) En el núcleo están codificadas las llamadas, es el corazón del S.O. el resto es accesorio: vi, sh, rc, son comando y programas que podríamos codificar a nuestro interés. Si se cambia el kernel internamente pero se mantienen las llamadas al sistema los programas siguen funcionando sin necesidad de recompilarlos. Si el programa se porta entre procesadores distintos pero con kernel compatibles sólo hay que recompilar para que el programa pueda funcionar. El núcleo de Linux es libre, por lo podemos acceder al código fuente y modificarlo libremente. La mayoría de las Llamadas al sistema son compatibles con cualquier versión de Unix: Unix Sys V, HP-UX, Solaris, SunOS, Linux, etc y algunas con otros sistemas operativos Ej.- Msdos o Windows aunque en menor grado. Casi todas las llamadas al sistema cumplen el siguiente esquema: int Nombrellamada ( Parámetros ) Devuelve –1 si no se ha podido realizar. Ejemplo: int access(const char *pathname, int mode); (Consultar man 2 access, En el capítulo (2) del man se encuentran todas las llamadas al sistema.) Variables globales relacionadas extern int errno Código de error del la última llamada (0 a sys_nerr ) extern int sys_nerr Número de máximo de códigos de error extern char *sys_errlist[] Lista de textos asociados a un código de error la función void perror( char * cadena ), imprime un la cadena con el texto asociado a errno Sistema de ficheros I 5 SISTEMAS DE FICHEROS EN SISTEMA UNIX ARQUITECTURA DEL SISTEMA DE FICHEROS Características • • • • Estructura jerárquica. Un árbol de directorios que comienza en el directorio raíz :/ Todos los ficheros pertenecen a un usuario y grupo y tiene unos permisos asignados rwx La mayor parte de los dispositivos ( discos, puertos serie, paralelo, terminales, memoria ) se van a tratar como ficheros especiales. La unidades de almacenamiento son transparentes al usuario, estando montadas sobre el árbol general de archivos ESTRUCTURA El S.O. Linux puede manejar distintos sistemas de ficheros (tipos de particiones): MSDOS, Window 95/98 (vfat), Window NT (NTFS), iso9660, OS/2 los sistemas de ficheros más habituarles en GNU/Linux son: ext2, ext3, ReiserFS : Denominación de las unidades de disco en un PC: Discos IDE 2 Primarios y 2 Esclavos /dev/hda - /dev/hdb Discos SCSI /USB /dev/sda (+10 Unidades de disco o ) Floppy /dev/fd0 CDROM /dev/cdrom Cada una de las particiones Linux que existen en un sistema tiene una estructura de control: /dev/hda3 ( 3º Partición de la primera unidad IDE ) # fdisk /dev/hda Disco /dev/hda: 255 cabezas, 63 sectores, 526 Unidades = cilindros de 16065 * 512 bytes Disposit. Inicio Principio Fin Bloques /dev/hda1 * 1 324 2602498+ /dev/hda2 325 420 771120 /dev/hda5 325 358 273073+ /dev/hda6 359 420 497983+ #df -h S.ficheros /dev/hda1 /dev/hda6 cilindros Id 83 5 82 83 Sistema Linux Extendida Linux swap Linux Tamaño Usado Disp Uso% Montado en 2.5G 1.4G 1020M 58% / 471M 269M 203M 57% /home Cada partición es en un sistema de ficheros. Tener varias particiones y discos permite una mayor seguridad y tolerancia a fallos. Una de ellas debe ser la partición de arranque. Siempre suele existir una partición de swapping (Zona de intercambio de memoria, de paginación, memoria virtual ), que no es propiamente un sistema de ficheros. Sistema de ficheros I 6 Sistema de ficheros I Importancia del tamaño de bloque 7 Un sistema de ficheros se compone de una secuencias de bloques de datos de un mismo tipo Ej - 1024 bytes, 2K, 8K. El tamaño de bloque o cluster determina el espacio mínimo asignado a un fichero. Un fichero aunque su tamaño sea de un byte, ocupa como mínimo un bloque. Hay que considerar: - Problema entre la rapidez y el aprovechamiento del espacio Por eficiencia los ficheros no siempre se guardan en bloques consecutivos, para evitar dejar huecos no utilizados -> Se produce la fragmentación de los ficheros La mayor parte de los ficheros son pequeños - ¿Que debe controlar el sistema de ficheros de una unidad de almacenamiento? Hay que tener control de los bloques libres y ocupados por cada fichero, mantener la información sobre los directorios, manejar los buffers en las operaciones de entrada y salida, controlar que ficheros están abierto, por que procesos, almacenar los premisos, permitir enlaces, controlar el acceso compartido a un mismo fichero.... Estructura básica de un sistema de ficheros GNU/Linux Boot Superbloque Lista de i-nodos Bloques de datos ............... Boot Programa de arranque del sistema, se encarga de cargar el inicio del sistema operativo Superbloque Contiene la información básica de control del sistema de ficheros: • • • • • • Tamaño del S.F. Tamaño del bloque (1024 bytes, 1K hasta 8K) Número máximo de fichero (i-nodos) Lista de bloques libres, índice al primer bloque libre Lista de i-nodos libres, índice al primer i-nodo libre Información adicional : Si ha sido modificado, nº de montajes, primer i-nodo (/), si el sistema está actualizado, si hay que chequearlo,etc. Lista I-nodos Esta lista se carga en memoria en una tabla interna del S.O. para mayor rapidez. Cada fichero tiene asociado un número de I-nodo (que es único). Los archivos se identifican internamente por el número de I-nodo, no por el nombre o enlace, pues un fichero en GNU/Linux puede tener varios nombres. Sistema de ficheros I 8 Información que contiene un i-nodo: • • • • • • • • • • Número de i-nodo ( único para cada archivo ) Propietarios: identificador de usuario y grupo Tipo de fichero ( Ordinario, directorio, dispositivo ) Permisos (RWX) para dueño, grupo y otros Tiempo de acceso, creación, modificación Número de enlaces ( Distintos nombres ) Tamaño de fichero Estado del i-nodo ( bloqueado, hay copia del datos en buffer ) Punteros a los bloques de datos Tabla de direcciones de bloques en disco: (Ejemplo si suponemos que el tamaño de bloque es un 1K cual seria el tamaño máximo de fichero que podemos manejar ) 10 Direcciones a bloques directas, 10 * 1K 10 K 1 Una indirección simple 256 * 1K= 256 K 1 Una indirección doble 256 * 256 * 1K = 65.536 K = 64 Mb 1 Una indirección triple 256 * 256 * 256 = 16.777.216 K = 16 Gb El sistema de ficheros FAT Es tipo de partición implementado en MS-DOS y Windows 98. Su estructura es muy sencilla pues no permite el control de usuarios en el acceso a los ficheros. En sistemas servidores ( NT o W2K) lo habitual es utilizar particiones NTFS. Boot Tabla de asignación de ficheros Directorio Raíz Bloques de datos En las particiones FAT no existe el concepto de i_nodo, la información de los archivos se almacena en los directorios. La asignación de espacios se realiza mediante una lista encadena de los bloques que ocupa el archivo en la tabla de asignación de ficheros. El directorio raíz es un directorio especial que se tiene un tamaño fijo. Información de un directorio en una partición FAT - Nombre del archivo - Extensión - Atributos (Sólo lectura, oculto, sistema, normal) - Tamaño - Hora y fecha de creación / modificación / acceso - Puntero al primer bloque ocupado por el fichero en la Tabla de asignación. La asignación de bloques se mantiene en la tabla de asignación de ficheros mediante una lista encadenada Sistema de ficheros I TIPOS DE FICHEROS EN UNIX: Ordinarios, directorios, dispositivos, fifos y sockets 9 Ordinarios Lista consecutivas de byte ( Visión del S.O. ) Operaciones básicas: abrir, cerrar, leer, escribir, añadir (escribir al final), posicionarnos, truncarlo a 0 o a un tamaño determinado. No se puede insertar o eliminar bytes directamente. Directorios Un archivo especial ( no podemos leer o escribir directamente ) Información [ Nombre de fichero, i-nodo ] Mínimo dos entradas para .. y . ( El directorio padre y el propio directorio) Cuando un mismo i_nodo tiene varios nombres, decimos que tiene varios enlaces. Un fichero no se borra hasta que no se eliminan todos sus enlaces, se borran todos sus nombre. Estructura Nº inodo 2334 3784 Longitud del Nombre 10 4 Nombre del archivo Programa.c saco Tamaño mínimo de un directorio : un bloque Operaciones • Leer ( Leer el directorio) • Escribir ( borrar, crear archivos ) • Ejecutar ( Explorar el directorio, buscar un nombre ) Tipos de enlaces: - Un enlace duro es dar un nuevo nombre de fichero para un mismo I-nodo $ln pepe jose. Sólo se pueden establecer si ambos nombre pertenecen al mismo sistema de ficheros. Sólo el superusuario puede hacer enlaces entre directorios, para evitar en el recorrido del árbol de directorios. Sistema de ficheros I -Un enlace simbólico o blando es un fichero con el camino a otro fichero ( semejante a los enlaces directo a archivos de Windows) 10 $ln –s pepe jose Se pueden crear enlaces simbólicos entre ficheros de distintas particiones (sistema de ficheros) y entre directorio. Dispositivos En este caso el i-nodo no guarda información sobre almacenamiento sino sobre las características del dispositivo ( major number y menor number ) Tipo de dispositivo y número de unidad del dispositivo. En muchos caso vamos a poder realizar operaciones de lectura/ escritura como si fuesen archivos convencionales. Normalmente los dispositivos se almacenan en le diretorio /dev. Dos tipos básicos: -Dispositivos de bloques (E/S direccionable) Ej.- disco duro, memoria ( /dev/hda) -Dispositivos de caracteres (E/S secuencial), un puerto serie, un módem (/dev/tty, /dev/lp) Un mismo dispositivo físico puede tener varios dispositivos lógicos asociados según el tipo de operaciones que vayamos a realizar. Fifos y Sockets Son Ficheros especiales utilizados para la comunicación entre procesos que no ocupan espacio en disco. Los Fifos (pipe) se utilizan para comunicar procesos dentro de una misma máquina y los sockets para comunicar proceso dentro de una misma máquina o entre máquinas distintas. Sistema de ficheros I 11 TABLAS DE CONTROL DE FICHEROS Para gestionar los sistemas de ficheros el kernel mantiene una serie de tablas de control en memoria principal: - Tabla de i-nodos (UNA) Copia de la lista de i-nodos almacenada en la partición en memoria principal -Tabla de ficheros abiertos (UNA) Tabla con la información de los ficheros abiertos en el sistema i-nodo, proceso que lo ha abierto, permisos de ese proceso, tipo de apertura, posición en el fichero, buffer de E/S - Tabla de descriptores de ficheros (MÚLTIPLES, una por cada proceso activo) Es una tabla de interna de cada proceso activo en el sistema Cada fichero que abre tiene un descriptor asociado de 0 – N, siendo N el máximo de ficheros abiertos por un proceso. Normalmente el sistema cuando arranca un proceso le abre los tres primeros descriptores: Nº Descriptor 0 1 2 3 Fichero Entrada estándar stdin Salida estándar stdout Salida estándar de errores stderr -- Generalmente es el primer descriptor libre que se asignará al ejecutar el primer open Se permite que varios procesos puedan abrir el mismo fichero o que un mismo fichero lo pueda abrir varias veces un mismo proceso. En este caso tendrá distinto número de descriptor. Cuando se abre un fichero siempre se asigna el número de descriptor más bajo disponible. Descriptor de fichero Æ Nombre de archivo Æ I-nodo. Sistema de ficheros I 12 Manejo de ficheros ordinarios Llamadas al Sistema: Operaciones básicas Trabaja con descriptores (números enteros) int fd; -Open : int open ( char *nombre fichero, int flag, [ mode_t modo ] ) flag : O_RDONLY O_WRONLY O_RDWR O_NDELAY ( No esperar en FIFOs o Línea de comunicaciones ) O_APPEND O_CREAT O_EXCL O_TRUNC El parámetro mode ( Sólo se utiliza cuando está el flag O_CREAT ) Permisos del nuevo fichero Ej- 0666 Devuelve un número descriptor de fichero o -1 -Creat: int creat ( char * nombre, [ mode_t Crea y abre el fichero de escritura -Read: modo ] ) int read ( int fd, char * buffer, unsigned int Devuelve el número de octetos leídos o -1 nbytes ) -Write: int write ( int fd, char *buffer, unsigned int nbytes ) Devuelve el número de octetos leídos o -1 -Close : int close ( int fd ) -Lseek : off_t lseek ( ing fd, off_t desplazamiento, int origen ) origen : SEEK_SET ( Inicio del fichero ) SEEK_CUR ( Posición actual ) SEEK_END (Final de fichero ) off_t ( long int ) Devuelve la nueva posición desde el principio de fichero o -1 -Dup : int dup (int fd ) Asigna un segundo descriptor al un fichero que ya estaba abierto con el descritor fp. Es como si lo abriese dos veces. Sistema de ficheros I 13 Librerías estándar <stdio.h> La librería de entrada y salida estándar está implementada a partir de las llamadas al sistema. Utilizan una estructura de control propia (FILE *) para manejar los ficheros y gestionar su propio buffer de E/S. FILE * fp Funciones: fopen, fread, fwrite, fclose, fseek, rewind, fclose, foef -Lectura y escritura en ficheros de texto fgets, fgetchar, fputs, fputchar, fprintf, fscanf -Lectura y escritura en ficheros binarios planos, con estructura size_t fread ( & Registro, sizeof(Registro ),size_t numreg,FILE *stream ) size_t fwrite( & Registro, sizeof(Registro ),size_t numreg,FILE *stream ) Lista las principales funciones de la librería stdio.h: fcloseall fdopen feof ferror fflush fgetc fgetchar fgetpos fgets fileno flushall fopen fprintf fputc fputchar fputs fread freopen fscanf fseek fsetpos fwrite getc getchar gets sprintf – Escribe a una cadena sscanf - Lee de una cadena perror printf putc putchar puts remove rename rewind scanf ungetc unlink Sistema de ficheros I 14 Llamadas al sistema: Operaciones de control chmod : Cambia los permisos de un fichero: int chmod(const char *path, mode_t mode); int fchmod(int fildes, mode_t mode); umask : Define la mascara de permisos de creación de ficheros mode_t umask(mode_t mask); access: Comprueba si se puede acceder a un fichero int access(const char *pathname, int mode); mode = R_OK, W_OK, X_OK y F_OK. R_OK, W_OK y X_OK se utilizan para la comprobación de lectura, escritura o ejecución del fichero, respectivamente. F_OK se utiliza para ver si se permite la mera comprobación de la existencia del fichero. chown : Cambia el propietario de un fichero int chown(const char *path, uid_t owner, gid_t group); int fchown(int fd, uid_t owner, gid_t group); int lchown(const char *path, uid_t owner, gid_t group); Cambia el propietario del fichero especificado por path o fd. Solamente el superusuario puede cambiar el propietario de un fichero. El propietario de un fichero puede cambiar el grupo de dicho fichero a cualquier grupo al que dicho usuario pertenezca. El superusuario puede cambiar el grupo arbitrariamente. truncate : Trunca a un número de bytes el fichero indicado int truncate(const char *path, off_t length); int ftruncate(int fd, off_t length); truncate hace que el fichero nombrado por path o referido por fd sea truncado a una longitud máxima de length bytes. Si el fichero era mayor que dicha longitud, los datos extra se perderán. Con ftruncate, el fichero debe estar abierto para escritura. stat : Información detallada sobre un fichero int stat(const char *file_name, struct stat *buf); int fstat(int filedes, struct stat *buf); int lstat(const char *file_name, struct stat *buf); Estas funciones devuelven información del fichero especi- Sistema de ficheros I 15 ficado. No se necesitan derechos de acceso al fichero para conseguir la información pero sí se necesitan derechos de búsqueda para todos los directorios del camino al fichero. struct stat { dev_t ino_t mode_t nlink_t uid_t gid_t dev_t st_dev; st_ino; st_mode; st_nlink; st_uid; st_gid; st_rdev; /* /* /* /* /* /* /* off_t st_size; unsigned long st_blksize; /* /* unsigned long st_blocks; time_t st_atime; time_t st_mtime; time_t st_ctime; /* /* /* /* dispositivo */ inodo */ protección */ número de enlaces físicos */ ID del usuario propietario */ ID del grupo propietario */ tipo dispositivo (si es dispositivo inodo) */ tamaño total, en bytes */ tamaño de bloque para el sistema de ficheros de E/S */ número de bloques asignados */ hora último acceso */ hora última modificación */ hora último cambio */ }; utime : Cambia las fechas de acceso y modificación de un fichero. int utime(const char *nombrefichero, struct utimbuf *buf); utime cambia los tiempos de acceso y modificación del nodo-í especificado por nombrefichero a los campos actime y modtime de buf respectivamente. Si buf es NULL, entonces los tiempos de acceso y modificación del fichero se ponen al tiempo actual. La estructura utimbuf es: struct utimbuf { time_t actime; /* tiempo de acceso */ time_t modtime; /* tiempo de modificación */ }; El tiempo se almacena en forma de segundos transcurridos desde el 1 de Enero de 1970. fcntl : Realiza operaciones de control sobre el fichero int fcntl(int fd, int cmd); int fcntl(int fd, int cmd, long arg); int fcntl(int fd, int cmd, struct flock * lock); fcntl realiza una de las diversas y variadas operaciones sobre fd. La operación en cuestión se determina mediante cmd: Cambiar/ Consultar los modos de apertura Control de archivos entre procesos Control del bloqueo sobre fichero Sistema de ficheros I CONTROL DE ACCESO MÚLTIPLE SOBRE FICHEROS 16 Cuando varios procesos acceden simultáneamente a un fichero pueden ocurrir condiciones de carrera que produzcan datos inconsistentes y errores de funcionamiento en las aplicaciones. El control de acceso a los recursos compartidos es una de las funciones básicas realizadas por el S.O. para lo que ofrece una serie de mecanismos para regularlo. Ej.- El acceso no controlado a un fichero de reservas aéreas donde acceden procesos de distintas agencias de viajes podría reservar plazas donde no existen. En las aplicaciones comerciales la gestión de los bloqueos se realiza automáticamente por los SGBD (Sistemas de gestión de bases de datos) Procedimiento general de acceso al un fichero compartido ... FijarBloqueo() Procesar el fichero() QuitarBloqueo() .... Problemas a evitar: Interbloqueo : Que dos o más proceso se queden en una espera infinita por espera de recurso cruzada. Solución: los recursos siempre se deben solicitar el mismo orden. Inanición : Evitar que un proceso se quede esperando de forma infinita por el acceso a un recurso. Solución: quitar siempre el bloqueo y establecerlo durante el mínimo tiempo posible. TIPOS DE BLOQUEOS O CANDADOS Según el control del recurso - Consultivo : Procesos cooperativos, se debe consultar el estado de recurso antes de usarlo, depende del programador, si no se pregunta por el candado podemos acceder libremente al recurso. - Obligado : Procesos no cooperativos, el sistema operativo controla en todo momento el acceso al recurso, impidiendo el acceso si está bloqueado aunque no se haya consultado el candado. Según la espera por el recurso: - Activa, El proceso está en un ciclo permanente a la espera de que el recurso esté libre. - Pasiva, el proceso no consume CPU, está dormido, el sistema operativo se encargará de activar el proceso cuando el recurso sea liberado. Según la granularidad o tamaño del bloqueo: - Bloqueo total a nivel de fichero, se impide el acceso a todo el fichero - Bloqueo parcial a nivel de zona del fichero, se impide el acceso a una parte del fichero, normalmente a un registro determinado. Según la operación a realizar: - Bloqueo de Lectura (compartidos), normalmente no hay problemas si varios procesos lee simultáneamente el mismo archivo. - Bloqueo de Escritura (Exclusivos), si un proceso está escribiendo de un archivo, normalmente hay que controlar que otro proceso lea o escriba del mismo antes que el archivo esté totalmente actualizado. Sistema de ficheros I 17 IMPLEMENTACIÓN EN UNIX: Existen tres formas de controlar el acceso. Los tres son métodos independientes y generalmente para procesos cooperativos. En algunos sistemas Unix o Linux con fcntl se puede implementar bloqueos obligados, aunque está característica implica un retardo en todas la operaciones de E/S sobre ficheros. Algunas versiones de Unix incluyen la función lockf en vez de flock, que permite bloquear del acceso a parte del fichero. • • • Fichero auxiliar de candado ( open + O_EXCL ) flock ( Bloqueo cooperativos ) fcntl ( + Completo : cooperativo y en zonas ) Mediante un fichero auxiliar de candado: El candado está bloqueado si existe un fichero auxiliar: Sólo uno proceso puede crear el fichero. Si puedo crearlo accedo al recurso, después lo borro para indicar que el recurso está libre. En la llamada open al opción O_CREAT con O_EXCL falla si el fichero ya existe. EJEMPLO: fd = open (“ficherocandado”,O_CREAT | 0_EXCL | O_RDWR , 0600)) if ( fd ¡= -1 ) { //Accedo al recurso compartido HacerAlgo() // Libero el recurso: Cierro el fichero y lo borro. close(fd); unlink(“ficherocandado”); } else { if ( errno == EEXIST ) // Recurso bloqueado else // Otro tipo de error Ej.- fallo en los permisos } Este es un método sencillo que funciona prácticamente en todos los sistemas operativos y plataformas independientemente de la versión. Sistema de ficheros I 18 Mediante la llamada flock int flock(int fd, int operation) Impone o elimina un candado de recomendación (advisory lock) en un fichero abierto. El fichero está especificado por fd. Las operaciones válidas son: LOCK_SH Candado compartido. Más de un proceso puede tener un candado compartido para un fichero en un momento dado. LOCK_EX Candado exclusivo. Solamente un proceso puede tener un candado exclusivo para un fichero en un momento dado. LOCK_UN Desbloqueo. LOCK_NB No se queda en espera al intentar un bloqueo. Se utiliza junto con las dos primeras opciones. Sobre un fichero sólo puede existir un tipo de bloqueo Mediante la llamada fcntl La función fcntl permite realizar varias operaciones, entre otras cosas fijar candados sobre ficheros, estos candados pueden ser lectura o escritura en todo o en parte del fichero (bloqueo de registros) int fcntl ( int df, int orden, struct flock *candado ) orden: F_SETLK ( Intenta fijar un bloqueo y vuelve si no puede hacerlo ) F_SETLKW ( Intenta fija un bloqueo, si no puede espera ) F_GETLK ( Recupera información sobre los bloques existentes) Utilizamos la estructura: struct flock { short l_type; short l_whence; off_t l_start; off_t l_len; pid_t l_pid; }; // // // // // Tipo candado Posición relatica del candado Posición Inicial Posición Final Nº de proceso que ha hecho el bloqueo Tipo (l_type): F_UNLCK, si no hay candado. F_RDLCK, Si hay un candado de lectura F_WRLCK, Si hay un candado de escritura Posición relativa (l_whence): SEEK_SET, SEEK_CUR, SEEK_END Si l_start y l_len son iguales a 0 se bloquea todo el archivo