/ Generación de Herramientas Básicas de Administración para la computadora NexT. Equipo Utilizado. Computadora NeXT. Terminal de Titán. Software Utilizado. Ambiente de Programación de Bourne Shell. Lenguaje de Programación "C". Responsable del Proyecto. M. C. Juan Carlos Pérez C st Al da. Alumno. \ 128405 /Martin 'í,c. p r c í a Nava. IY Matrícula 85229843. CowUTc)c\.od Materia. Proyecto Terminal II. Período: Trimestre 91-1. 1 Resumen. El presente trabajo ha sido realizado como parte de los requisitos de la Licenciatura en Computación de la Universidad Autónoma Metropolitana Unidad Iztapalapa, en lo que respecta al proyecto terminal II. Consta de dos partes; en la primera se presenta un conjunto de rutinas que tienen por objeto permitir mayor facilidad en la administración y manejo de algunos dispositivos de almacenamiento; todo esto, bajo el ambiente de programación de Bourne Shell del Sistema Operativo UNlX V. En la segunda parte se ejemplifica con algunos programas codificados en lenguaje Cyel uso de las llamadas al sistema, la sintaxis de estas y los parámetros que reciben como entrada, además de la explicación necesaria para su revisión y uso. Mce. Introducción 2 PARTE I 1. Rutinas básicas de administración para la NeXT 4 1.1 Rutina tree 4 1.2 Rutina backup 13 1.3 Rutina unbackup 21 1.4 Rutina updatelog 26 PARTE II 1. Llamadas al sistema operativo UNIX. 34 1.I Programa errmesgs 34 1.2 Programa chatio 37 1.3 Programa copy 42 1.4 Programa remove 46 1.5 Programa chmod 49 1.6 Programa chown 51 2. Semáforos 54 2.1 Programa dbms 56 2.2 Programa addcust 61 2.3 Programa prcust 64 Conclusiones 66 Bibiiografía 68 Introducción. A lo largo del desarrollo del Sistema Operativo UNlX se ha ido s modificando paulatinamente la interface con el usuario final para acrecentar l2 su aceptación. Se han creado una gran cantidad de herramientas para 3 a -L $ 7 permitir una forma de utilización relativamente más sencilla a pesar de los extraños nombres de sus instrucciones, su sintaxis minima y su documentación escaza. Debido tambien a que el sistema UNlX tiene una compleja administración ya que fue diseñado por expertos para su propio uso y en su inicio fueron ignoradas las necesidades de los usuarios, en favor de la velocidad y la precisión desde el punto de vista de los expertos; es necesaria la presencia de una persona encargada de las tareas de administración y supervisión, para sostener la integridad y segundad necesarios para el uso eficiente de la gran cantidad de archivos y utilerías disponibles de uso común, los archivos del sistema y restricciones sobre la cantidad de espacio de almacenamiento disponible para cada uno de los usuarios y así prevenir sucesos desagradables como pérdidas de información, inconsistencia en el acceso a los archivos y degradaciones del sistema. La ausencia de una persona encargada de las funciones administrativas en la computadora NeXT de la División de Ciencias BWcas e ingeniería, crea la necesidad de desarrollar herramientas que el usuario pueda utilizar sin necesidad de ser un experto en el Sistema ni en la administración y sin la preocupación de correr ciertos riesgos en el momento 2 de la ejecución de las instrucciones. Esta necesidad se ve enfocada a las funciones básicas de administración y mantenimiento delsistema como son: - Visualización del contenido de los directorios para su fácil respaldo. - Generación de respaldos de disco duro a disco óptico. - Restablecimiento de respaldos. - Compactación de los archivos respaldo. - Descompactación de los archivos respaldo. - Generación de archivos bitácora de los respaldos lleradoa a cabo. - Llamadas al sistema para generar utilerías para el sistema operativo UNIX. Lo anterior podría servir como material de apoyo para los futuros cursos de Sistemas Operativos impartidos en las licenciaturas en Computación y Electrónica en Computación que tengan este enfoque. Los programas de administración se realizaron en el ambiente de programación de Bourne Shell, el código de cada uno de estos esta acompañado de la documentación necesaria para su ejecución y la información de su funcionamiento, así como la especificación de las instrucciones de UNIX utilizadas para cada urn de los casos. Las rutinas de ejempio que se muestran en lenguaje "C", igual que las antes mencionadas, vienen acompaííadas de la documentación necesaria para su ejecución y la información de su funcionamiento. 3 RUTINAS BASICAS DE ADMlNlSTRAClON PARA LA COMPUTADORA NEXT. PARTE I. RU~IMS Básicas de Administración para la Computadora NeXT. A continuación se describe cada una de las utilerias hechas, se hace mención de cada una de las instrucciones utilizadas para desarrollarlas y se trata de explicar con detalle el significado de cada uno de log argumentos utilizados, ya que a medida que se hace uso de estos, su significado se hace menos evidente o en un momento dado imposible de entender. Rutina tree. Modo de ejecución: tree [nombre de directorio] Comentarios. El programa tree genera un listado en forma de árbol, de los subdirectorios y archivos encontrados a partir del nombre de directorio, si el nombre de directorio es omitido, se asigna como nombre de directorio el directorio domicilio (HOME) especificado por un punto (.) en la sustitucibn de parámetros llevada a cabo en la sentencia especificada por ${l:-.}. El programa utiliza las intrucciones de UNlX find, sort, y el editor no interactivo g@. A continuación se explica ampliamente la función de cada una de las instrucciones, sus parámetros y la forma en que utiliza las expresiones regulares para hacer reconocimiento de patrones y así encontrar 4 las cadenas de caracteres requeridas para la formación del árbd de subdirectorios. Find localiza los archivos que están en los diredonos especifk¿td~~, y los selecciona por medio de una expmm. La instrucción no genera ninguna salida si no hay instrucciones explícitas para hacerlo. La búsqueda se realiza en todos los subdirectorios y a todos los niveles. La exprdón contiene uno o más criterios, con los cuales find prueba cada uno de tos archivos de cada uno de los directorios para verificar si los satisface. La separación de los criterios por un espacio supone una relación y; es decir, se deben cumplir ambos criterios para poder seleccionar el archivo. Si los criterios van separados por -o, la relación considerada es Q; esto es, debe satisfacer uno o ambos críterios para poder ser seíecccionado. Para la negación de un criterio se precede éste por un signo de admiración. Los criterios son evaluados de izquierda a derecha por and a menos que haya paréntesis que los agrupen. A continuación se explican los criterios utilizados para la instrucci6n find. -print El archivo evaluado siempre satisface este criterio. El nombre de la trayectoria del archivo se despliega cuando la evaluación de la expresión llega a éste criterio. Si éste 8s el Único criterio, entonces find despliega los nombres de todos los archivos que se encuentran en la lista de directorios. 5 Si -print s8 encuentra relacionado con otro criterio mediante y, find despliega el nombre del archivo solo si se cumplen tales criterios. sort ordena y/o mezda uno o más archivos de texto en secuencia. Se toma la entrada de los archivos especificados en la linea de manadato o de la entrada estándar. A menos que se utiüce la opdón -O, la salida de SO^ va a la salida estándar. Si no se especifica una opción, port Ordena el archivo en la secuencia de ordenamiento del código ASCII. es un editor por lotes (no interactivo). Los mandatos de m,por lo general se almacenan en un programa archivo, aunque es posible dar mandatos a sencillos en la línea de mandatos. Por omisión, $8d copia líneas de la lista de archivos dada corno parámetro en la salida estándar, editando las lineas del proceso; también selecciona las lineas que deben editarse de acuerdo con su posición dentro del archivo (numero de linea) o con el contexto (igualdad de patrones). Sep toma la entrada de los archivos especificados en la linea de mandato o de la entrada estándar. A menos que un programa a direccione su salida a otra parte, ésta irá a la salida estándar. A continuación se expücan las opciones-utilizadas por la instrucción sed, también se dará una breve explicación de las expresiones regulares y su significado en el contexto de la instrucción a utilizada en este programa. -e Hace que copie sus entradas a la salida estándar, editadas de acuerdo a la secuencia de ordenes que se le indiquen. p (Opción de impresión). La instrucción escribe en la salida estándar las líneas seleccionadas. Escribe las líneas de inmediato y no refleja los cambios posteriores en la línea. d (Oción de borrar). Esta instrucción impide que @ escriba ia(s) iínea(s) sdeccionada(s) en la salida estándar y que termine de procesar la línea. Lee otra línea de la entrada y comienza de nuevo con el primer mandato de la linea de mandato. 8 (Sustituir). Tiene el formato siguiente: s/patrón/cadena de reemplazoflg] [p][w] El patrón es una expresión regular delkniada por cualquier carácter (que no sea un espacio o un carácter nueva línea). La cadena de reemplazo comienza innmediatamente después del segundo delimitador y debe terminarse con el mismo delimitador. Se requiere el delimitador final (el tercer delimitador). 7 Las expresiones regulares definen un conjunto de una o más cadenas de caraderes. Las expresiones regulares basicas son cadenas de caracteres que no contienen caracteres especiales, excepto delimitadores. Una expreSión regular básica define sólo a la cadena de caracteres que representa. Las expresiones regulares más compiejas utilizan letras,números y caracteres especiales para definir muchas cadenas de caraderes diferentes, asi; una expresión regular equivale a cualquier cadena de caracteres que define. Los caracteres se representan a sí mismos en una expresión regular, los caracteres especiales no se representan a sí mismos; si se desea que un carácter especial se represente a sí mismo es necesario marcado precedcenddo con una barra diagonal invertida, siempre y cuando no sea un dígito ni un paréntesis. Los caracteres especiales utilizados en las expresiones regulares son: el Punto, 108 corchetes, el asterisco y lossignos A (circunflejo) y $ (signo de pesos). El punto. El punt6 equivale a cualquier carácter. Los corchetes (o). Los corchetes (O) definen una dase de caracteres que define cualquier carácter sencillo dentro de ellos. Si el primer carácter que sigue al corchete izquierdo es un circunflejo (A), los corchetes definen una clase de caracteres que equivale a cualquier carácter sencillo que no se encuentre 8 dentro de los corchetes, refinendose al complemento del conjunto de caracteres que se encuentran entre los corchetes. Las barras diagonales invertidas, los asteriscos y los signos monetarios pierden su significado especial. Un corchete derecho que aparece como parte de la dase de caracteres sóio puede aparecer como el primer carácter después del corchete izquierdo, el símbolo A solo es especial si es el primer carácter despuh del corchete izquierdo. El asterisco. El asterisco representa cero o más apariciones de un equivalente de la expresión regular que lo precede. La expresión regular puede incluir cualquiera de los caracteres especiales definidos anteriormente. Los signos A y $. Las expresiones regulares que inician con un circunflejo (A) equivalerr a una cadena al inicio del archivo o el inicio de una línea, el Signo monetario ($) al final de una expresión regular representa la cadena que le precede como el final de una línea. Como parte final de las expresiones regulares, se da el significado de cada una de las utilizadas en el código de la herramienta tree como parte de la opción de sustitución del editor &. "sl[^/l*/I /I$":Se sustituyen todas las cadenas de caracteres que terminan con el carácter "I", antecedido por cadenas de caracteres que no tienen el carácter "I" por cadenas que solo tienen algunos espacios en blanco y 9 terminan con el carácter "/".Todas las apariciones del patrh que no se traslapen en las líneas seleccionadas ser& sustituidas debido a la bandera global g. "SI* */I/!":Se sustituyen todas las cadenas de caracteres en Manco colocadas al inicio de las líneas, que terminan con el caracter "/", por el carácter "/". "sln([A/I?)$l\1lw: Se buscan todas las líneas que terminan con cualquier cadena de caracteres que no contenga el carácter "/",precedida por el carácter "/",en este caso no se sustituye sino que el valor del patrón es asignado al valor de la cadena de rempiazo. Las banderas incluidas en el formato de la instrucción d;8d, despues del tercer delimitador indican lo siguiente: g (Bandera global). Esta señal hace que la instrucción de sustitución reemplace todas las ocurrencias del patrón que no se traslapen en las líneas sekcton * adas. p (Bandera de impresión). Esta seAal hace que a envíe todas las líneas en las que realiza sustituciones a la salida estándar. Si hace más de una sustitución en la línea, &a es enviada a la salida estándar una vez por cada sustitución. 10 w (Bandera de escritura). Esta es similar a la bandera p, excepto que envía la salida a un archivo específico. A esta señal debe seguirle un espacio y el nombre de un archivo. Como parte final de la explicación de la rutina tree, se da una breve revisión al significado de los conductos. Un conducto es una herramienta que usa el Shell para conectar la salida estándar de un programa a la entrada estándar de otro. Elefecto producido por un conducto es el mismo que ocurre si se redirecciona la salida estándar de un programa a un archivo y después se usará éste como la entrada estándar a otro programa. Prescinde de los mandatos separados y del archivo intermedio. El símbolo de un conducto es una barra vertical (I). 11 Código fuente de la rutina tree. find ${1:-.} -print I sort Ised -e "1p" -e "Id" \ -e "sl[^/l*/l /Is"\ -e "si^ */1/1"\ -e "s~A([^fl?)$t\l1" 12 Rutina backup. (Utileria de generación de respaldos) Modo de ejecución: a.- backup b.- backup -i c.- backup -D dir/archivo -d dispositivo 4 a.- Sin argumentos la rutina backup r v o a el contenido cal directorio domicilio (!HOME) en el dispositivo por omisión, en este caso se utilizó el la6/tmp/tmpbak, en el cual se hicieron las directorio temporal /opt/usr/e061 pruebas iniciales de respaldo por falta de acCBs0 directo a los dispositivos como cintas, discos ect. Esta forma de ejecución de la rutina no crea ningún archivo bitácora que almacena los nombres de los archivos respaldados. Este modo de ejecución en realidad hace una copia de respaldo del directorio actual del usuario, en el directorio antes especificado, sin embargo; al instalarse en el ambiente idoneo, el respaldo debe ser dirigido a un dispositivo previamente definido por el administrador del sistema. b.- -i: Esta opción sirve como ayuda para el usuario. Simplemente se muestra un archivo de texto que contiene las opciones con los parámetros válidos y la explicación de cada uno de est-, los cuales son utilizados por la herramienta backup. El archivo de texto que contiene la información mencionada se llama backinfo y se debe encontrar en el directorio donde la rutina backup se ejecute. c.- -D dir/archivo: La opción -D indica que la herramienta backup obtendrá como parámetro un nombre de directorio o un nombre de archivo, especificado en los argumentos de la opdón como dir/archivo, para ser respaldado. En este caso es necesario escribir la opción y el argumento, si no se hace la especificación adecuada se dará un mensaje de error por la herramienta backup, terminando la ejecución de ésta. -d dispositivo: La opción -d indica que la herramienta backup obtendrá como parámetro el nombre de un dispositivo (un disco, una cinta, 6 un propio archivo si así lo desea el administrador) el cual debe ser especificado por dispositivo en los argumentos de la opción, para allí almacenar la información que se ha de respaldar. Como en el caso anterior es necesario escribir la opción y el argumento, si no se hace la especificación adecuada se dará un mensaje de error por la herramienta backup, terminando la ejecución de ésta. -I : La opción -I indica que la herramienta backup creará un archivo bitácora, que informa cuales archivos fueron respaldados y en que fecha. El archivo bitacora se crea con la siguiente formato del nombre: bak.MM:DDM. 14 Donde MM se refiere al mes, DD se refiere al da y AA al año en que se llevó a cabo la acción de respaldo. El archivo tiene como formato lo siguiente: - La fecha de realización de respaldo. - El nombre de cada uno de los subdirectorios respaldados y el nombre de cada uno de los archivos que estan contenidog en estos. Comentarios. El programa backup genera respaklos del árbol de subdirectorios especificado, en el dispositivo indicado. La acción de respaldo se lleva a cabo utilizando las intrucciones de UNlX y -io. A continuación se explica ampliamente la función de cada una de las instrucciones, sus pardmetros y también se listan como ejemplo los nombres de algunos dispositivos válidos para el Sistema V de UNIX. Find localiza los archivos que están en los directorios especificados, y los selecciona por medio de una expresión. La instrucción no genera ninguna salida si no hay instrucciones explícitas para hacerlo. La búsqueda se realiza en todos los subdirectorios y a todos los niveles. La expresión contiene uno o más criterios, con los cuales find prueba cada uno de los archivos de cada uno de los directorios para verificar si los satisface. La separación de los criterios por un espacio supone una relación y; es decir, 15 se deben cumplir ambos criterios para poder seleccionar el archivo. Si loe criterios van separados por -o, la relación considerada es 9; esto es debe satisfacer uno o ambos criterios para poder ser selecccionado. Para la negación de un criterio se precede &e por un signo de admiración. Los criterios son evaluados de izquierda a derecha por find a menos que haya paréntesis que los agrupen. A continuación se explican los criterios utilizados para la instrucción find: -depth Este criterio se encarga de generar nombres de trayectoria, elimina los problemas cuando se intenta crear archivos bajo subdirectorios que solo permiten ser leidos. -print El archivo evaluado siempre satisface este criterio. El nombre de la trayectoria del archivo se despliega cuando la evaluación de la expresión llega a éste criterio. Si éste es el Único criterio, entonces find despliega los nombres de todos los archivos que se encuentran en la lista de directorios. Si. -print se encuentra relacionado con otro criterio mediante y, find despliega el nombre del archivo d o si se cumplen tales criterios. Cpio es un programa que copia una lista de archivos en un Único archivo de salida grande, creando cabeceras de separación entre los archivos 16 de modo que puedan ser recuperados individualmente. La orden cplo tiene opciones que permiten escribir en los dispositivos y otras que permiten leer los dispositivos y reescribir los archivos que se encuentran en ellos. Se puede utilizar cpio para escribir algún archivo diredamente sobre el d¡sco duro de la máquina, aunque se utiliza m b frecuentemente para escribir archivos sobre disco fexible o cinta. Los archivos hechos con C D ~ Opueden ocupar varios discos, lo cual permite hacer copias de seguridad eficientes de grandes jeraquias de directorios. coi0 preserva el propietario y el Último tiempo de modificación del archivo, además también puede almacenar texto corno archivos de código binario. Usar $do es el modo más eficiente de almacenar archivos en un disco flexible, y el archivo hecho por c ~ i o es particularmente más pequeño que el conjunto de archivos originales que lo componen. Sus opciones son: -0 Con esta opción la instrucción coi0 lee la entrada estándar para obtener una lista de nombres de trayectoria de archivos y copia esos archivos a la salida estándar al mismo tiempo con el nombre de la trayectoria y la información de estado. 17 ”-- . 4 C Este argumento de la instrucción paio escribe cabeceras de información en formato ASCII siendo así el respaldo portable. Se usa esta opción cuando las máquinas origen y destino son de tipos diferentes. v (Modo verboso) Este argumento de la instrucción cato genera una lista de nombre8 de archivo, esta lista es impresa en el archivo de error estándar. B Este argumento de la instrucción @ especifica que la entraddsalida es hecha en bloques de 5120 bytes en lugar de un flujo de datos. Si el archivo hecho con cpio va a residir en el disco duro de la máquina la opción no es necesaria, pero si va a residir en disco fexW debe ser utilizado pues se acelera el acceso al disco. 18 Código fuente de la mina backup. dir="." dev=/opt/usr/e0611a6AmpAmpbak BB=/dev/null TRUE=O FALSEzI LOGFILES=$FALSE if [ $#/ -eq 1 -a "4" = "$1" ] then clear cat backinfo Imore else while getopts D:d:I VAR do case $VAR in D) dir=$OPTARG d) deV=$OPTARG .. II I) LOGFILES=$TRUE fechadate +?&d?/om?!&y' filename="bak.$fecha" date > $filename 19 .. 11 *) echo $USO rm $filename >$BB 2>$BB exit 2 .. 11 done find $dir -depth -print I cpio -0cBv > $dev if [ $LOGFILES -qTRUE ] then find $dir -depth -print >> $filename fi fi exit O Como un comentario adicional al código de la rutina, se puede observar que dentro de la estructura del case en el cuerpo del ciclo while existe en la opción "+" (que es equivalente al "cualquier otro" de P a d o C ) , una variable llamada USO, esta variable genera un mensaje con las opciones válidas de ejecución de la rutina. La opción "*" es elegida cuando en la linea de mandato no se ejecutó la rutina con un parámetro válido. Esta variable será utilizada en las rutinas que a continuación se muestran. 20 - .+ - - -.- c-- ~ I ai - - ".I ."._._...--^._I ,XI ~ -- Rutina unbackup (ütilería de reestablecimiento de respakbs) Modo de ejecución: a.- unbackup b.- unbackup -i c.- unbackup -d dispositivo -p patrón a.- Sin argumentos unbackup reestablece el contenido del dispositivo, (en este caso el dispositivo es un archivo) /opt/usr/e0611a6/tmp/tmpbak que es el dispositivo por omisión ya que en éi se hicieron los respaldos por omisión de la herramienta backup, en el directorio domicilio (HOME). Este modo de ejecución en realidad reestablece la copia de respaldo hecha en el archivo temporal del directorio actual del usuario. Ya que el patrón de recuperación de archivos es el asterisco w*w, significa que se han de recuperar todos los archivos contenidos en el archivo de respaldo. b.- -I: Esta opción sirve como ayuda para el usuario. Simplemente se muestra un archivo de texto que contiene las opciones con los parámetros válidos y la explicación de cada uno de estos, los cuales son utilizados por la herramienta unbackup. El archivo de texto que contiene la información mencionada se Hama unbackinfo y se debe encontrar en el directorio donde la rutina unbackup sea ejcutada. 21 c.- d dispositivo: La opción -d indica que la herramienta unbackup obtendrá como parámetro el nombre de un dispositivo (un disco, una cinta, 6 un propio archivo si así lo desea el administrador) especificado por dispositivo en los argumentos de la opción, para de allí restablecer la información antes respaldada. Es necesario escribir la opdbn y el argumento, si no se hace la especificación adecuada se dará un mensaje de error por la herramienta unbackup, terminando la ejecución de &a. -p (Patrón) Informa de la definición de un patrón con el cual se eligirán los archivos que se encuentran en el respaldo para su restablecimiento. Es necesado escribir tanto la opción como su argumento, si no se especifica ningún patrón el patrón por omisión es el asterisco "*", que especifica la restauración de todos los archivos. Comentarios. El programa unbackup restablece los respaldos del cksposRivo indicado. La acción de restauración se lleva a cabo utilizando la instrucción cpio de UNIX, además utiliza redirección de entrada/salida. A continuación se expka ampliamente la función de la instrucción y sus parámetros. 22 CD~O es un programa que copia una lista de archivos en un único archivo de salida "grande" (donde se almacenan todos los archivos), creando cabeceras de separación entre los archivos de modo que puedan ser recuperados individualmente. La orden cdo tiene opciones que permiten escribir en los dispositivos y otras que permiten leer los dispositivos y reescribir los archivos que se encuentran en ellos. se puede utilizar CDiO para escribir algún archivo directamente sobre el disco duro de la máquina, aunque se utiliza más frecuentemente para escribir archivos sobre disco fexible o cinta. Los archivos hechos con cnio pueden ocupar varios discos, lo cual permite hacer copias de seguridad eficientes de grandes jeraquias de directorios. Cpio presewa el propietario y la Última fecha de modificación del archivo, además también puede almacenar texto como archivos de código binario. Usar cpio es el modo más eficiente de almacenar archivos en un disco flexible, y el archivo hecho por cnio es particularmente más pequeb que el conjunto de archivos originales que lo componen. Sus opciones son: -i Con esta opción la instrucción cnio lee los archivos producidos mediante la opción -o. El archivo generado por la opción -o, 8s la entrada estándar de la instrucción cPlo, la cual restabiece los archivos de acuerdo con los nombres de trayectoria especificados cuando se generó la copia de respaldo. 23 C Este argumento de la instrucción CDIQ escribe cabeceras de información en formato ASCII siendo así el respaldo portatble. Se usa esta opción cuando las máquinas origen y destino son de tipos diferentes. v (Modo verboso) Este argumento de la instrucción CDIO genera una Heta de nombres de archivo, esta lista es impresa en el archivo de error estándar. B Este argumento de la instrucción cpio especifica que la entrada/sallida es hecha en bloques de 5120 bytes en lugar de un flujo de datos. Si el archivo hecho con CDIQ va a residir en el disco duro de la máquina la opción no es necesaria, pero si va a residir en disco fexible debe ser utilizado pues se acelera el acceso al disco. d Con esta opción de la instrucción cpir se indica en el momento de la restauración de los archivos respaldados, que los directonos son creados según vaya siedo necesario, dadas las trayectorias de loas archivos. 24 Código fuente de la rutina unbackup. patron="*" dev=/opt/usr/e0611acütmpílmpbak if [ $#-eq 1 -a "4" = "$1" ] then clear cat unbackinfo Imore else while getopts d:p: VAR do case $VAR in d) dev=$OPTARG .. VI p) patron4OPTARG .. II *) echo $USO exit 2 .. VV esac done cpio -icvBdu "$patron" < $dev fi exit O 25 Rutina updetelog (ütilería de actualización de archivo6 Mhxa de loar respaldos) Modo de ejecución: a.- updatelog -i b.- updateiog -v -b -c -u a.- -1: Esta opción sirve como ayuda para el usuario. Simplemente se muestra un archivo de texto que contiene las opciones con los parámetros válidos y la explicación de cada uno de estos, los cuales son utilizados por la herramienta updatelog. El archivo de texto que contiene la información mencionada se llama updateinfo y se debe encontrar en el directorio donde la rutina updatelog sea ejecutada. b.- Las opciones que a continuación se explican permiten al usuario dar un tratamiento específico a los archivos bitácora de los respaldos llevados a cabo. -V Esta opción de la herramienta updatelog permite la visuatización de un archivo bitácora. En primer lugar se lee el nombre del archivo bitácora y se verifican su existencia y sus permisos de acCBs0 de lectura, si es posible leerlo, entonces se procede a desplegarlo en la pantalk por medio de la 26 instrucción cat de UNIX, haciendo una redirección para la instrucción mom, la cual permite visualizar los archivos una pantalla a la vez. -b Esta opción de la herramienta updaadog pennite llevar a cabo la eliminación (borrado) de un archivo bitácora. Primeramente se lee el nombre del archivo bitácora y se verifican su existenda y sus permisos de lectura y escritura, si es posible escribir en él, se procede a mostrarlo utilizando la instrucción cat de UNIX dando su salida como entrada al programa more que muestra una pantalla delarchivo a la vez. Una vez observado el archivo se pregunta si realmente se desea borrarlo, si es así, se procede a hacerlo, en otro caso simplemente se ignora la petición de eliminación del archivo. -C En esta opción de la herramienta updatelog, se juntan todos los archivos que tinen como prefijo la palabra bak, seguidos de cualquier terminación después de un punto, en un solo archivo el cual se comprime inmediatamente por medio de la instrucción pack de UNIX. Después de esta opción no es posible volver a tener los archivos bitácora separados como estaban anteriormente, sdamente se obtendría un archivo que contuviera todos los archivos bitácora almacenados. 27 -U Con esta opción de la herramienta updatelog se descomprimen los archivos comprimidos hechos por la opción -c de la misma. Unicamente regresará a su tamah original los archivos antes comprimidos. Si en el directorio actual existe un archivo con el mismo nombre que el archivo a descomprimir, aunque no tenga la misma extensión .z, deberá respaldarse pues en el momento de descomprimir el archivo se podría sobreescribir en el del directorio actual. Comentarios. Esta herramienta utiliza basicarnente elementos de programación de Bourne Shell, sin embargo en la parte de compactación y descompactadón de archivos bitácora, se utilizan las instrucciones pack y unpack respectivamente. La instrucción pack de UNIX, se encarga de la compactación del archivo que contiene a todos los archivos bitácora, sus opciones son las siguientes: -f Esta opción se encarga de hacer la compresión de )os nombres de los archivos asociánddes una linea de estado. 28 I Esta opción se encarga de encender una bandm de estado con la cual se verifica la compresión. Sin esta opdón es probath que algunos archivos sean suceptiMes de no poderse comprimir. La instrucción pack genera un archivo con el mismo nombre que el archivo a compactar pero le agrega la extensión .z. Cuando el nombre del archivo es mayor de diez caracteres no se podrá generar el nuevo nombre de archivo y la acción de compresión no se lleva a cabo. La instrucción unpack se encarga de descomprimir el archivo dado, cuya extensión es .z, la instrucción unpack no tiene opciones. 29 BB=/dev/null if [ $#I -eq 1 -a "4" = "$1" ] then dear banner UPDATELOG updatelog cat updateinfo I more else if [ $# -ne O ] then while getopts vbcu VAR do case $VAR in v) banner .'IS JALIZAR LOGFl ,E echo "nombre del archivo bitacomhc" read filename clear if test -r "$filename" -a -w "$filename" then cat $filename I more else echo "incapaz de abrir ei archivo: k" echo $filename fi echo "return para confirwar k" read dummy clear .. PP b) banner BORRAR LOGFILE echo "nombre del archivo bitacora\nW read fiename clear if test -r "$filename"-a -w"$filename" then cat $filename Imore echo " desea eliminarlo? (S/N)" read resp if expr "$resp" : "A[sS]">$BB 2>$BB then rm $filename >$B5 b$88 fi else 31 echo "incapaz de abrir el archivo: \c" echo $filename echo "return para continuar" read dummy fi clear .. II c) banner COMPRIMIR LOGFILE fileS=bak. fecha='date +o/od:o/o&m?/y' filename="up$fecha" cat $files > $filename rm $files >$BB 2>$BB pack - -f $filename .. I9 u) banner DESCOMPRIMIR LOGFILE echo "nombre del archivo a descompactar: \e" read filename unpack $filename .. II *) echo $USO exit 2 32 esac done else echo “updatelog: numero ilegal de parametros\nic” fi fi exit O 33 LLAMADAS AL SISTEMA OPERATIVO UNIX. PARTE II. Llamadas d si*ema opemtlvo UNIX. Las llamadas al sistema operativo UNIX son utilizadais para manejar el sistema de archivos y controlar los procesos. A continuadón se mostrará el uso de algunas de las llamadas al sistema más comunes e importantes através de una serie de ejempbs tomados de algunas de las referencias indicadas en la bibliografía. Es recomendabte la ejecudón de de las rutinas mostradas para obtener más información de estas. Nombre: errmesgs Entradas: ninguna. Salidas: Estatus de salida. Para compilar: cc -o errmesgs ermiesgs.~ Ejemplo de ejecución: errmesgs Comentarios: Este ejemplo tiene dos cometidos principalmente, mostrar la sintaxis y uso de la llamada al sistema perror() y listar los mensajes de error producidos al hacer una acción no deseable en la utilizadón de las llamadas al sistema. Como puede observarse se hace uso de dos variables externas (errno y sys-nerr), las cuales son utilizadas con el siguiente objetivo: 34 La variable externa e m , especifica por medio del despüegue de una cadena de caracteres, un mensaje que indica la razón por la cual la llamada al sistema falló. La vanbie externa sys-mrr, especifica el valor máximo que ermo puede asumir, es decir; el máximo número de errores de llamadas al sistema que existen para el ambiente en el cual se este trabajando. El prototipo de la función 8s el siguiente: int perror(s) char 's; Donde s, es un cadena especificada por el programador, con el mensaje que este desee. 35 Código fuente de la rutina wmneSg8. #include ddi0.b #include <errno.h> main(argc. argv) int argc; char ' a w ; { int i; extern int errno, sys-nerr; for ( i d i; sys-mrr; H+H fprintf(stderr, %3d",i); errno = i ; perror (" I "1; exit (O); } 36 Nombre: Chrrio Entradas: archivo-sal ida, archivo-de-error-est andard Salidas: Estatus de salida. Para compilar: cc -o chario chari0.c Ejemplo: chario 2>MAYUSCUlAS >minusculas Comentarios: La rutina chario ejempiifica las llamadas al sistema read() y write(), la llamada al sistema read() se encarga de ejecutar todas las entradas y write() se encarga de ejecutar todas las salidas. AI usarse ambas se tienen las herramientas suficientes para hacer entrada y salida secuencialmenete. AI ser usadas con la llamada al sistema iseek(), proveen todas las herramientas necesarias para hacer entrada y salida aleatoriamente. La rutina chario muestra las subrutinas getchar() y putchar() las cuales utilizan las llamadas al sistema read()y write() para proveer la misma función como su contraparte de la entrada salida estandar. Esta rutina charlo escribe las letras mayúsculas al archivo de error estandar y todos loa otros caracteres a salida estandar. Las sintaxis de las llamdas al sistema rad() y write() son: int read(Descriptor-De-Archivo, Aputador-A-Buffer, Tamam-A-Transferir) int Descriptor-De-Arc hivo; char 'ApuntadorA-Buffer; unsigned Tamano-A-Transfen r; int write(Descriptor_De-Archivo, Apuntador-A~Buffw,Tamm-A-TransferSr) int üescriptor-De-Archwo; char *ApuntadorA-Buff er; unsigned Tamano-A-Transferir; Código fuenie de la rutina chario. #include *ctyp..h> #define EOF (-1) #define ERROFI (-1) #deíine S T W O #define STDouTl Mefine STMRFi2 r Subrutina principal. *i main(argc, argv) int argc; char * a r d ; { int c, rc = O; whib ((c = getchar()) I= EoFH if (mupper(c)){ if (errchar(c) I= ERROR){ perror("stderr"); r c = 1; break; 1el= I 1 if @utchW(c) - ERROR){ perror("std0ut'); rc= 1; break; 1 1 1 exit@); 1 39 r Subrutina gotchar(), utiliza la llamada ai sistema rnd() *I int getchar() { char c; int count; if ((count = read(STDIN, &c, sYed(c))) == OH count IE m ; Id-{ count = (int) c; 1 return(count); 1 r Subrutina putchar(), utilizala llamada al sistema m#.O *I int putchar(c) char c; I int count; if ((count = w r i t e ( S W T , &c, sizeof(c))) C sueof(c)# count = ERROR; I el= I count = O; I return(count); 1 40 128403 r Subrutina rrch.r(), utiliza la Hamada al sistoma w i l y ) *I int emhar(c) char c; I int count; i i ((oount Iwriie(STDERR, &c, J u d ( c ) ) ) I= sizeof(c))( - co~nt 1el- ERROR; { count = O; 1 return(count); 41 Nombre: COPY Entradas: archivo-fuente archivo-desti no Salidas: Estatus de salida. Para compilar: cc -0 copy c0py.c Ejemplo: copy fuente destino Comentarios: La rutina copy ejemplifica las llamadas del sistema create(),open(), read() y write(). Todas las operaciones de entrada salida inician abriendo un archivo usando ya sea la llamada al sistema treat() u open().Estas llamadas regresan un descriptor de archivo que tiene como función identificar el canal de entrada salida. Los descriptores de archivo con valores O, 1, 2 se refieren a los archivos de entrada estandar, salida estandar y error estandar respectivamente. La llamada al sistema read()se encarga de ejecutar todas las entradas y write() se encarga de ejecutar todas las salidas. AI usarse ambas se tienen las herramientas suficientes para hacer entrada y salida secuencialmenete. AI ser usadas con la llamada al sistema Iseek(), proveen todas las herramientas necesarias para hacer entrada y salida aleatoriamente. La rutina copy copia el contenido del archivo coiocado como primer 42 argumento al archivo coiocado como segundo argumento. La Sintaxis de las llamadas del sistema create(), open(),read() y write() son: int creat(Nombre-de-Archivo, modo) char 'Nombre-de-Archivo; int modo; üindude <fnctl.h> int open(Nombre-de-Archivo, OpCiones-&-Bandera char *Nombre-de-Archivo; int Opciones-de-Bandera, modo; [,fnodo]) int rmd(Descriptor_De-Archivo, Apuntador-A-Buff er, Tamam-A-Transferir) int Descriptor-De-Arc hivo; char *Apuntador-A-Buff er; unsigned TamanoA-Transferir; int write(Descriptor-De-Archivo, Apur,,¿dor-AJffer, TamanoA-Transferir) int Descriptor-De-Archivo; char 'ApuntadorA-Buffer; unsigned Tamano-A-Transferir; 43 Código fuente de la rutina copy. Mdine PMODE O755 Mefine STDiN O #define ERROR (-1) r Rutina principal. Aquf mismo, se haco la copia d. ke arch¡¡. *I main(argv) int argc; char 'arfl; I int infd, odd, count, rc char bt@UFSiz]; - O; 44 45 Nombre: remove Entradas: [fl archivo Salidas: Estatus de salida. Para compilar: cc -o remove rem0ve.c Ejemplo: remove archivo Comentarios: La rutina remove ejemplifica las llamadas al sistema, access() y unlink().El acceso a un archivo esta determinado por los permisos de este y los permisos del directorio en el cual se lleva a cabo la busqueda del archivo. Todos los archivos en elsistema UNIX tienen un campo denominado modo en el nodo i que contiene lospermisos del archivo. Este campo es un entero sin signo el cual es dividido en los siguientes subcampos: Máscara del Campo. Significado. Archivo regular. Archivo directorio. Archivo especial de carácter. Archivo especial de Hoque. Archivo searendal. 46 0004000 o0O2oO0 OOO1OOO 0000400 oooO100 0000070 0000007 Identiticación de usuario. Identificación de grupo. Texto guardado. Propietario, permiso de ledura. Propietario, permiso de -iura. Propietario, permiso de ejecución. Grupo, todos los permisos. Otros, todos los permisos. En primer lugar, el campo de permisos define que hacer y quien puede hacerlo en un archivo. Las c l a d de protecciones existentes en el sistema UNlX se aplican a los archivos del propietario, a los archivos del grupo y a los archivos de todos los demás. Así cada clase de permisos puede hacer entre otras, leer un archivo, escribir en un archivo y ejecutar el archivo. Los permisos de ejecución no tienen sentido para archivos especiales, ya sean de carácter o de bloque. La llamada al sistema unlink()elimina un archivo colocando un cero en la parte del nodo i de los archivos del directorio, reduce el campo del contador de ligas en el nodo i por 1 y libera losbloques de datos y el nodo i si el campo contador llega a cero. La sintaxis de las llamadas al sistema access() y unlink()se muestran a continuación. int access(Nombre-de-Arc hivo, modo) char ‘Nombre-de-Archivo; int modo; int unlink(Nombre-&-Archivo) char *Nombre-de-A rchivo; 47 Codigo fuente de la rutina c8move.c #include 4 k . b #define EXiST O #define WiiE 2 Mefine ERROR (-1) mamwmPf) int argc; char ' a m ; int fopticM = O, rc I - O, i; if (scf('Y,-, Bargc, Bargv) rc= 1; )el-{ for (i - =I O)( 1; strcmp(argv[i],"-");;»+K switch (arMil[l])( case Y': foption++; break; 1 1 } 1 (rc I-1 11 ++i =I argcx fprintí(stderr,"usar:94 ' [-fj archivo . ..W atpY[oI); , rc- 1; 1else { for (; i < argc; i++X 1 (Istrcmp(argv[i], "-.)) { fprintf(stderr,"%s: el archivo dado como argumento no puede ser entrada estandar\n".aqpfO]); r c = 1; ) else 1 (access(aigv[i], EXIST) I-ERRoRX pemr (argvftl); rc- 1; } else if (access(aFsv[i~WRiiE)-I ERFU)R && Hoptionx fprintf(stderr,%s: %s pmtqido contra escritura\n.,argv[O],argv[fl); ) else if (uniink(argflfl)H 1 1 1 perrwmil); rc- 1; exit(E); 48 Nombre: &mod Entradas: modo archivo Salidas: Estatus de salida. Para compilar: cc -o &mod chm0d.c Ejemplo: chmod 0700 miarchivo Comentarios: La rutina chmod ejemplirica la llamada al sistema chmod(),que permite cambiar los permisos de acceso de un archivo. El modo de un archivo puede ser cambiado solamente por el propietario y por el superusuario. Cuando la llamada al sistema chmod() falla, el modo anterior no es modificado. El prototipo de la llamada al sistema se muestra a continuación. int chmod(Nombre-de-Archivo,Modo) char 'Nombre-de-Archivo; int Modo; 49 Código fuente de la rutina chm0d.c #include 4db.b main(argc,argv) int argc; char ' a w ; I int K: = O, i, newmode; if(sdr,"", bargc, bargv) =I O 11 argc 4) { fprintf(stderr,"usar: %s modo archivo...\n', a~&0]); rc = 1; 1 h I if (sscanf(argv[2], "%o", &newmode) !I 1K fprintf(stderr, 94s: el modo dol argummio (%) no .o numericoli", argv[0l.argv[21); E = 1else I 1; for (i = 3; i < argc; i++X if (!strcmp(argv[i], "-")) { fprintí(stden,"%s: d modo de entrada estandar no puede ser difiCado\n',~O]); rc-1; } else if (chmod(argt(i], nemnode)== ERROR){ pemarsr[il); rc=l; 1 exit@); 1 1 1 I * 128405 Nombre: chown Entradas: Propietario Grupo dombre-&-Archivo Salidas: Estatus de salida. Para compilar: cc -o chown chown.c Ejemplo de ejecución: chown 1023 65 miarchivo Comentarios: La rutina chown ejempiifka la llamada al Sistema &own(), que permite cambiar las identificaciones de propietario y grupo de un archivo, los cuales le son dados como argumentos. Si el nuevo propietario o grupo es precedido por un signo de suma, entonces el viejo propietario o grupo es preservado, respectivamente. El prototipo de la llamada al sistema se muestra a continuación. int chown(Nombre-de-Archivo, Propietario, Grupo) char *Nombre-de-Archivo; int Propietario, Grupo; 51 Cóóigo fuente de la rutina ch0wn.c #include etdb.b #include eyydtypes.h> #include <sysistat.h> #define OWNER #define GROUP #define FkENAME 2 Mefine SAVE '+' #define ERROR (-1 1 3 4 main(argc, argv) int argc; char ' a w ; I Hit giá, uid, ngid. nuid, rc O, i; I char Yname; struct stat stab; if (=4"",M,~argc,8argv)== O II argc < 5M fprintf(stden,"usar: 968 propietario grupo amhivo...Li',argqO]); r c = 1; lek{ nuid = atoi(aw0WNERI); ngid = atoi(argv[OROW>n; for (i = FILENAME; i < argc; i++) { if (istrcmpta~i],~-n)) ( fprintí(stdm,"%s: el a r c h dedo como arpumento no puede ser entrada estandarli". arovl01); r c = 1; } eke A (stai(arov[il,&statb)I= ERROR)( PeWUgiil); rc- 1; 1else ( uid Istab.st-uid; gid = statb.stgid; if (argv[OWNERl(O] I- SAVE) { uid = nuid; 1 - if (arsv[GROUPl[O] != SAVE) ( gid rigid; 53 Semáforos. A continuación se hará una descripción de un tipo de henamientae que permiten la intercomunicación entre procesos, estos son denominados semáforos. se mostrará su funcionamiento a partir de un conjunto de programas que simulan un DBMS. Los semáforos son una estructura de datos compartida por varios procesos. Son usados por esos procesos para sincrodzar sus operaciones en algún recurso de tal forma que las operaciones no interfieran con algún otro proceso. En el sistema UNlX V, la familia de llamadas al sistema para los semáforos provee las operaciones requeridas para garantizar que un único proceso tenga el derecho de continuar su evolución mientras suspende a los otros que tienen los mismos privilegios. Todos los accBsos a los semáforos inician colocando un identificador de semáforo con la llamada semget().El prototipo de la llamada al sistema $emget()tiene la siguiente sintaxis. ##include <sysAypes.h> #include <sys/ipc.h> #include <sysísem.h> int semget(Llave, Número, Bandera) key-t Llave; int Número, Bandera; 54 En este caso Llave 8s el nombre del conjunto de semáforos, Número, define el número de semáforos en el conjunto, Bandera es una combinación de las siguientes: IPC-CREAT el conjunto de semáforos denominados Uawe es creado si es que no existe. IPC-EXCL cuando es combinado con IPC-CREAT, IPC-EXCL fona a la llamada semget() a regresar un error cuando el conjunto semáforo existe. MODE los 9 bits de la parte baja de la bandera definen el modo de acceso del conjunto de semáforos cuando es creado con semget(). Una vez creado el conjunto de semáforos, la llamada al sistema semop() 8s usada para operar el conjunto. El prototipo de la llamada al sistema tiene la siguiente sintaxis: #include <sysAypes.h> #include <sysTipc.h> #include <sysísem.h> int =mop( Identificador, Operaciones, Número) int Identificador; struct sembuf (*Operaciones)[l; int Número; ldentificador define el semáforo regresado por semgea(),Operac ones es el arreg1o.de estructuras de las operadones de semáforos y Números define el número de entradas de operaciones. 55 Archivo de cabecera -.h En el archivo de cabecera se define la estructura de la base de datoa, la estructura de los mensajes, y se declaran las Constantea usadas por los programas dbms, addcust y prcust. #define ERROR #define FtEAüQ (-1 1 "rcst" #define W RmQ "wcsr Mefine SEMAP"E #define EMCOUNT #define RMOM "scst' #deíine WMOOE o666 #define D E i i Y P E 1 #define UNLOCK 0.1 ,SEM-UNDO #define LOCK #define NAMESKE 0,-1,SEM-UNDO 40 #define READCUST 1 #define WRITECUST #define DBMSERR 2 3 #define ALñEAüY 4 #define NOCUSTMER 5 #define OK ALREADY Mefine S E N A L o1 00 1 o644 struct cust{ char namqNAMESKE]; char due; 1; struct meesageI bng request; brig 4 bng status; struct cust cust; 1; struct m# m a type; strucí message m; 1; 56 Código fuente de la rutina dbm8.c La rutina dbmr hace log accesos a la base de datos a través de los mensajes que manda a los programas de aplicación. Cada programa de aplicación requiere control exclusivo de las colas de mensajes para mandar y recibir peticiones, además de recibir información que lestranfiere la rutina bdms. #include cMi0.b #include csy&iypcs.b #include <syl/lpc.h> #include eydmsg.ha Windude qsWrn.h> #include csys/signal.h> #indude csetjmp.h> #include "dbms.h' main(argc,argv) int argc; char ' a w ; int E = 1 , qid, W d . sid; { FILE ' f p ; if (sd("","",&argc,&argv) =I O 11 argc I= 3H fprintf(stderr,"usar: $68 b8se de datosW,arg~O]); } else ií((fp = fopen(argv(2], -r+-)) (FILE *) NULL && (íp = fopen(atgv(2l, We)) (FILE *) NULLM N I - peWaigil1; } dse -- H ((qid = m ~ ( o e t k e y ( R U W ) , I P C _ C A E A T I I P C _ E X C 4 R M ) ) fprintf(stderr,%s no puede crearse\%\la ERRoRH cola de mensajes\n",argv[O],RUW); pem(RW); } else A ((wqid = msoset(setkev(wRmQ),IPC_CREA~IPC_EXCLIWMOOE))ERROR)( fprintí(stden,%s no puedo crearse \%s\lacoia de msnsajes\n",arsv[O],WRlTEQ); perror(WRREQ); } else if ((sid = semg&(getkoy(SEMAPHOFtE),l ,IPC-CREAilIFC_EXCLIWMODE))== ERRoRK fpri¡tí(stderr,%sno puede crearse \"%s\"~maloro\n",~O]rgiO],SEMAPHORE); perror(SEMAPHORE); 1el- I 1 rc = update(arsv[21.fplrqid,wqU,sKI); fdOse(fp1; (void)msg@l(rqid,iPC-RMlD); (VOW (void)msgcti(wqid,lPC_RMiü); (void)semctl(sid,O,lPC-RMD); ex#(rc); 1 57 static jmp-but Jmp; struct sembuí Qunkdc - {UNLOCK); static int Uptade(f~,fplr<iid,wq#,wqld,sid) char Vilename; FILE 'íp; int rqid,wqid.sid; I int rc - O, n, catch(); strud ms msg; (void)dgn8l(SiGHUP, SIGJGN); (void)dgn8I(SK;lNT, SB-IGN); (void)MgnPI(SiGQüiT, catch); (void)Mgnal(SIGIii, catch); (void)signal(SiGW. catch); (vokl)dgnal(SiGIOT, catch); (void)signal(SffiEMT, catch); (void)dgnal(SiGFPE, catch); (void)Mgnal(SiGBUS, catch); (void)signal(SiGSEGV, catch); (void)signal(SIGSYS, catch); (void)signal(SiGPIPE, catch); (void)rignd(SKZALRM, catch); (void) signal(SÑTERM, catch); (void)signal(SiGUCR1, catch); (void)signal(SiGUSFi2, catch); if ((E= setjmHJmp)) -- O){ if (semop(sid,&Qunbck,l) 1el= I While - ERROR)( pem(SEMAF+HORE); IC= 1; (IC == OH if (receive(READQ,rqid,&msg) <= O x 1el= IC- 1; { siwtch( msg.m.request )( case REAüCUST msg.m.status = rcud(fikname,íp,&msg.m); break; caso WRmCusT: msg.m.status = nmist(fikname,fp,&mrg.m); 58 static int rcust(fileriame,fp,p) char Yilename; FILE ‘fp; strud message ‘p; 1 int rc; if (fSeek(fp,p->id sizeof(S2nrct cust),O))( pem(f¡ame); i~ = DBMSERR; ) el- if (fread((diar *) &p-xust,sizeof(stnid cust), 1 fp) = ALREADY; 1el= I TC NOCUSTOMER; 1 retwn(rc); 1 59 I= 1 && p-mst.name(O] C NULLH static int wcust(filename.fp,p) char Yilename; FILE ' f p ; struct message 'p; { intrC-OK; static int catch(signo) int signo; I bngjmp(Jmp,sigW; 1 60 -_-I_ <.,l..." . ------.I Código fuente de la rutina addcu8t.c La rutina addcu8t.c se encarga de agregar un nuevo elemento a la base de datos manipulada por dbms.c #include 4 k . b #include <rysíiypes.b tinlcude dys/ipc.h> #include <sysímsg.h> #include <syydm.h> #include etype.h> #include "dbms1.h" main(argc,argv) int argc; char 'argQ I int rc = l,rqid,wqid,sid; FILE 'tp; if ( s c f r , w . & a w , ~ a w== ) 0 II aroc > 2)I íprintf(stden:usar: %sW,ergV[O]); I else if -- ((wid= msget(seH<ey(W3W,O)) == ERROR II (rqid = msgget(geH<ey(WRmQ), O)) ERROR II (sid = semgd(got&ey(SEWHORE),l,O)) == ERRoRM fprinti(stden,%s: start-up wmr ", argdo]); fprintf(stden:el DBMS se encuentra inactvow); - 1else t rc = add(rqid,wqid,sid); I exit(@; I 61 struct s e w Qunkdc = {UNLOCK}; struct sotnbui Qlod< {LOCK); I static int aWrqid, W, SU) int rqid, wqid, ski; i int n,rc = O; char buffeflBUFSuj,'p; struct ms msg; while (rc == O){ pnntf(.lD: 3; if ((n = scanf("%ldjg'c",¿kmsg.m.id)) == E m PUtdiWW break; } else if (n h 1){ fprintí(stden,'lD no validoh"); whik(getchar() !I In'); } else if (semap(sid. &Qbck,1 ) I I ERRoRH perror(SEWHORE); tc - 1 ; 1else I msg.m.request = READCUST; if (send(WFiIEQ, wqid, 6msg) 11 recdve(READQ, rqid, &msg) == O)( r c = 1; } else if (msg.m.status =I ALREADY){ fprintf(stden,%id: cliente exbtenteli',msg.m.id); } else if (msg.m.status == DBMSERRX fprintf(stden,"Enw en la Base de Dabs al leer el ID $6#\n",msg.m.id); 1else { IC= 1; while (1){ pnntf("N0mbre: "); if flgets(buffer, sUeof(bufíer).stdin) I= NULL){ fpr¡¡(stden.lnEl diente debe tener nombre\n"); 1else { for (P = buffer; lisalpha(fp); PHI; for (n = O ; (n < NAMESIZE 1) 68 'p I- In'; n++){ msg.m.cust.name(n] = *p++; - 1 msg.m.cust.name[n] if (n == O){ NULL; rc 1 1 - 1; return(rc); 1 63 Código fuente de la rutina prcust.c La rutina prcust.~se encarga de imprimir el registro del diente seleccionado. #include d o . b #indude <syblypes.h> #include <sys/pc.h> #include <sydmsg. h> #include <sydsem.h> Windude "dbmsl.ha main(m a r g v ) int argc; char ' a m ; I int rc = 1, rqid, wid, sid; FILE 'tp; 64 - struct sembuf Qunkdc {UNLOCK}; struct sembuf Qlock = {LOCK); static int pr(rqid,wqid,sid) int rqid,wqid,sid; - { int rc O, n; struct ms msg; Whib (E O){ printf("lD: 3; if ((n Iscanf(%ld%'c",&msg.m.id)) -- pUtchar(ln'); break; } else if (n I- 1){ fprintf(stderr,"lD no validoh"); while (getchar() I- W); } else if (semop(sid,&Obck,l)R ERROR){ penor(SEMAPHORE); rc- 1; 1el= { msg.m.request - READCUST; if (send(WREü.wqid.&msg) rc- 1; It receive(REAW.r@.&msg) =- OH ) else A (msg.m.status .I-NOCUSTOMER)( fprin(f(stderr,"Clie no para ID %#Li",msg.m.id); ) else if (nmg.m.aatus -= DBMSERRX fprirttí(~rr,%tentando el ID de la Base de Datos %Id\n",msg.m.id); rc- 1; 1el= I printf(UNombre:UU%s\n",msg.m.cust.name); printf(itMontoAt$9b5.Mn',msg.m.cust.due); ) if (semop(sid, &Quniock, 1) ERRORH 1 1 1 -- perror(SEMAPH0FiE); rc 1 ; - return(rc); 1 65 conclusiones. Las rutinas mostradas en este reporte dan una idea de la capacidad y el poder que tiene el conjunto de instrucciones de m m e Shell y las llamadas al sistema. Estas rutinas se basan especifkamente en el respaldo y recuperación de información; sin embargo, considero que seria muy prudente acrecentar el número de ellas dirigiendoias no s6Jo a la administración de los dispositivos de almacenamiento, sino a la administración de los usuarios, es decir, estabiecer información certera acerca del grupo y los usuarios que han tenido determinadas sesiones obteniendo así información estadística de ello; además de generar rutinas utilizando tanto lenguaje C y el ambient8 de Bourne Shell para hacer mantenimiento de archivos, de directorios, de dispositivos de almacenamiento secundario y tener capacidad de revisar la información a nivel de las estructuras de almacenamiento y poder modificarla o corregirla. Esto proporcionaría herramientas más versátiles para verificar los errores que se presentan de manera frecuente a nivel de las estructuras de archivos y directorios. El hecho de aprender y utilizar un sistema operativo como UNIX, permite al usuario comparar el mundo de opciones de desarrollo en las computadoras personales y el universo de las máquinas medianas y grandes; no sólo es cambiar de punto de vista acerca de la capacidad de las computadoras, sino valorar y comprobar de manera práctica los estudios 66 teóricos de aigunas materias de la licenciatura, cuando se habla de ss itemas operativos que no son precisamente personales. Desgraciadamente muy raras veces se utilizan en la práctica escolar, tal vez porque en nuestra Universidad se necesitan demasiados galardones o titulos que amparen la Capacidad del alumno para encontrarse con 888 universo que le permitirá un mayor desarrollo para su Mum vida profesional, brindandole mejores y más amplias opciones de trabajo. Lo anterior provocó que la realización del presente reporte, en cuanto a llamadas al sistema y lenguaje C se refiere, omitiera algunas rutinas que no pudieron ser ejecutadas en alguna máquina con UNIX. Los ejemplos omitidos se refieren al manejo de la memoria compartida, y el uso de sockets que son estructuras utilizadas en la intercomunicación de procesos.' 128405 BiMiografici. Thomas, Rebeca; Rogers, Lawrence; Yates, Jean L. Advmced Proarammer's Guide to UNIX SYSTEM V. Osborne McGraw - Hill Berkeley California, 1986. Bach, Maurice J. The Desian of the UNIX ODeratina Svstem. Prentice - Hall, Inc. Englewood Cliffs, New Jersey, 1986. Sobell, Mark G. Guía práctica para el S i e m a Operativo UNIX. SITESA, Addison - Wesley Iberoamericana, 1987. Coffin, Stephen. UNIX manual de referencia. McGraw - Hill lnteramencana de México, 1990. Kernighan, Brian W.; Pike, Rob. El entorno de programación UNIX. Prentice - Hall Hispanoamericana, 1987. 68