CowUTc)c\.od

Anuncio
/
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
Descargar