SISTEMAS OPERATIVOS 2. Enxeñería Técnica en Informática de Xestión. Curso 20052006 PRACTICA 1: El sistema de ficheros de UNIX. Se deben desarrollar los siguientes ejecutables, codificados en lenguaje C, haciendo uso de las llamadas al sistema necesarias: 1. Un programa de nombre modo que visualiza en pantalla los permisos y el tipo de uno o varios ficheros. El formato de visualización es el mismo que con el comando ls –l. Ejemplo: $modo tmp tmp: drwxr-xr-x 2. Un programa de nombre permisos que sirva para cambiar los permisos de un fichero o ficheros. El formato será el siguiente: permisos máscara fichero. Ejemplo: $permisos rw-r--r-- *.c 3. Un programa de nombre mover que permite renombrar un fichero. La sintaxis es la siguiente: mover origen destino. Se debe comprobar que no existe previamente el fichero destino. 4. Un programa de nombre mils que visualiza en pantalla los ficheros de un determinado directorio. El formato de visualización debe ser el mismo que con el comando ls –l (no se implementa, por tanto, recursividad de acceso a subdirectorios). 5. Un programa de nombre usuarios que muestra la lista de usuarios definidos en el sistema. Ejemplo de formato: $usuarios Usuario: root UID: 0 GID: 0 root Directorio inicial: / Intérprete de comandos: /bin/sh Usuario: pitufo UID: 406 GID: 6 users Directorio inicial: /home/pitufo Intérprete de comandos: /bin/bash Además, se debe realizar lo siguiente: A. Los programas 1, 4 y 5 deben tener la opción de redireccionar la salida estándar a un fichero pasado como argumento tras el símbolo “=”, usando la llamada al sistema dup(). B. Realizar una compilación separada con la ayuda de la utilidad make. C. Implementar una librería estática y una librería dinámica con las funciones comunes a dos o más programas individuales. Realizar las compilaciones de los ejecutables incorporando el código de las librerías. Comentarios • Para acceder a los directorios en UNIX se utilizarán las funciones de la librería que utilizan la estructura dirent. (man directory y man dirent para obtener información). Las entradas de directorio tienen tamaño variable, y su formato es: Número inodo (4 bytes) Longitud entrada (2 bytes) Longitud nombre (2 bytes) Nombre (terminado en '\0' hasta una longitud múltiplo de 4) (variable) Para obtener la información de los ficheros se usarán las llamadas al sistema stat, fstat y lstat. La sintaxis de estas llamadas es: stat (pathname, &statbuf); fstat (df, &statbuf); lstat (pathname, &statbuf); pathname es el nombre de un fichero, df es un entero descriptor de fichero y statbuf es una variable de tipo estructura stat que se encuentra declarada en el header <sys/stat.h>. Los ficheros cabecera correspondientes a las llamadas antes citadas son <dirent.h> y <sys/stat.h>. • Para ver el valor de un link simbólico puede utilizarse la llamada al sistema readlink(). • Para consultar las entradas de /etc/passwd: getpwent, setpwent, endpwent, getpwnam y getpwuid. Existen llamadas análogas para el fichero /etc/group. • El cometido del comando make es realizar una compilación condicional, actualizando los ficheros ejecutables a partir de los ficheros de los que dependen, si es necesario debido a cambios en estos últimos. Esta tarea la lleva a cabo aprovechando la información de dos fuentes: - la descripción de dependencias y vínculos, y de las acciones suministradas por el usuario, dentro de un fichero Makefile. - las fechas de las últimas modificaciones de los ficheros. Fecha de entrega Semana del 28/11 al 2/12, en horario de prácticas.