Sei sulla pagina 1di 250

HERRAMIENTAS DE

SISTEMA
PROGRAMACION
EN S.O. UNIX
J ulio Borque Almajano
CCUZ - 32
Servicio de I nformtica-Centro de Clculo
Universidad de Zaragoza
HERRAMIENTAS DE PROGRAMACION
EN SISTEMA OPERATIVO UNIX
Autor: Julio Borque Almajano
Servicio de Informtica-Centro de Clculo
de la Universidad de Zaragoza, 1995.
Sistemas Centrales
Edificio de Matemticas
Ciudad Universitaria. 50009 - ZARAGOZA
Tfno: 976 761000 Ext. 3167
Edita: Secretariado de Publicaciones
de la Universidad de Zaragoza
Depsito Legal: Z-882-95
PRESENTACION
==============
HERRAMIENTAS DE PROGRAMACION UNIX
======================================
Esta publicacin recoge la documentacin que se entrega en el Curso de
"Herramientas de programacin del Sistema Operativo Unix" impartido por el
Centro de Calculo de la Universidad de Zaragoza.
Contiene una reproduccin de todas las transparencias que usa el profesor
en sus exposiciones.
No es un manual de referencia, sino un material didctico dirigido a facilitar
la utilizacin de los programas y utilidades que facilita el sistema operativo Unix a
los programadores que trabajan con l.
En el curso hay dos partes diferenciadas una primera continuacin de la
publicacin "el sistema operativo Unix para usuarios" que recoge los comandos
para la programacin en k-shell que no se vieron en la anterior publicacin, y una
segunda que es la que propiamente da el titulo a esta publicacin que trata algunas
herramientas utilizadas en el proceso de produccin de software.
Los ejemplos que se adjuntan al final de la publicacin estan tomados en
parte de programas y documentacin perteneciente a Hewlett Packard.
INDICE HERRAMIENTAS DE PROGRAMACION UNIX
==============================================
CONTENIDO POR CAPITULOS :
1. PROGRAMACION CON EL INTERPRETE (ksh).
2. USO DE COMPILADORES Y HERRAMIENTAS AFINES .
cc , ld , cpp , as , cxref , lint , cflow, nm , cb
3. CREACION Y MANEJO DE LIBRERIAS .
ar , ld
4. RECONSTRUCTOR AUTOMATICO.
make
5. GENERADORES DE PERFILES.
prof , gprof
6. DEPURADOR SIMBOLICO.
xdb
7. PREPARACION DE DOCUMENTACION DE PROGRAMAS PARA USAR
CON MAN.
man , nroff , catman , tbl
8. HERRAMIENTAS PARA LA GENERACION DE ANALIZADORES
LEXICORAFICOS.
lex , yacc
9. ANEXO DE EJEMPLOS REALES.
9.1. Shell scripts, uno es un filtro de impresora y el otro es un parche
para arreglar sendmail.
9.2. Programa en C para simular el lanzamiento de un dado.
9.3. Programa en C con una sesin debugger grabada.
9.4. Makefiles de instalacin del editor asedit y traductor de Pascal
a C.
9.5. Informe generado por gprof sobre la ejecucin del programa 9.3.
9.6. Pgina de manual no formateada y fichero fuente de tbl.
9.7. Ficheros fuente de lex y yacc.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.1.- SHELLSCRIPTS : Introduccin a Shells.
Concepto de shell.
Una shell es un lenguaje de comandos interactivos con el cual se permite acceder
al sistema operativo Unix.
Ksh.
En este curso vamos a utilizar la shell creada por David G. Korn en los laboratorios
de ATT.
Realmente los comandos de la Korn Shell forman un lenguaje completo, potente y
de alto nivel para programar aplicaciones, en algunos casos ms fcil y rpido que
otros lenguajes de alto nivel.
Es muy apropiado para utilizar la tcnica del prototipado.
Se ha decidido utilizar la ksh en vez de sh o csh, ya que esta implementa las
mejores utilidades de ellas, aportando adems otras muy interesantes.
Caractersticas de ksh.
Ms amplio que sh o csh, lo que proporciona ms posibilidades, en muchos casos
los programas en ksh corren ms rpidos que los de sh o csh.
El uso de ksh se esta haciendo muy popular, restringiendo el uso de las otras
shells, est adems disponible en casi todos los equipos.
Es compatible con sh.
Es estndar prcticamente cumple IEEE POSIX 1003.2.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.2.- SHELLSCRIPTS : Shell y shell scripts.
Concepto de shell script.
La shell es una interface de usuario, su uso puede ser interactivo, por medio de
ordenes tecleadas despus del prompt de usuario, o utilizando un fichero donde
se acumularn las ordenes que despus se harn ejecutar.
A estos ficheros donde tenemos las ordenes los llamamos shell scripts o
simplemente scripts.
Las rdenes o comandos de una shell script se ejecutan siguiendo un control de
flujo similar a un programa escrito en un lenguaje de programacin de alto nivel.
Contenido del captulo.
El contenido de este captulo va a versar sobre la k-shell en relacin con la
construccin de scripts, as como el anterior curso se centraba ms en la
utilizacin de la shell en interactivo.
Evidentemente hay conceptos comunes en estas dos utilizaciones de la shell,
solo comentaremos aqu los que sean propios para la construccin de scripts.
A partir de este captulo veremos programas tiles para la
programacin en un entorno Unix, de esta forma este captulo
es especial dentro de la estructura del curso.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.3.- SHELLSCRIPTS : Para crear y ejecutar shell scripts.
Notas para la creacin de un shell script.
La mecnica para crear y ejecutar shell scripts es:
- Crear con un editor un fichero donde pondremos los comandos de la shell .
- Utiliza al construir un shell script, el smbolo # al principio de lnea para poner
comentarios y hacer ms comprensible el texto.
- Cambiar la proteccin del fichero para hacerlo ejecutable, utiliza la orden
chmod +x. Si escribes scripts frecuentemente te podras definir un alias como
cx = 'chmod +x'
- No se necesita compilar un script despus de escribirlo.
- Para ejecutar un script utiliza una de estas dos tcnicas:
Teclea el nombre del script seguido por sus argumentos separados por
espacios o marcas de tabulador.
Ejecuta una shell y aade como argumento de esta el nombre del script y
sus argumentos, sera de la siguiente forma:
$ ksh nombre_script arg1 arg2 ...
- Normalmente se ejecuta el script en una shell separada, para que no se haga as
se debe utilizar un punto y espacio antes del nombre del script.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.4.- SHELLSCRIPTS : Finalizacin de la ejecucin de una
shell script.
Despus de ver las formas de comenzar la ejecucin de un script trataremos aqu las
posibles formas de que un script termine:
- Ningn comando ms por ejecutar.
- Que se ejecute un comando exit.
- Ejecutar un comando return cuando se esta fuera de una funcin.
- Ejecutar un comando exec con algn argumento. En este caso el script ser
reemplazado por el programa que se haya especificado en el primer argumento
del comando exec.
- Detectar un error en la construccin del script (no en comandos del script sino en
posicionamiento de parmetros, errores de redireccionamiento, problemas con los
alias, etc ).
- Recibir una seal que no pueda ser ignorada, para la cual no exista un comando
en el script que la capture, y adems normalmente esta seal produzca la
cancelacin del proceso.
- Salir de un comando del script con valor de retorno igual a falso y adems tenga
las opciones precisas.
A lo largo del captulo iremos ampliando estas nociones.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.5.- SHELLSCRIPTS : Parmetros de un script.
Concepto de parmetro de un shell script.
Llamamos parmetros de un script a las entidades que nos proporciona ksh en las
cuales podemos guardar valores para utilizar en este script.
Clases de parmetros.
Son tres variables, parmetros posicionales y parmetros especiales:
Variables.
Son parmetros con nombre, es decir se denotan con un identificador
propio, pueden ser vectores con la forma vector [ ndice ].
Parmetros posicionales.
Son aquellos que se denotan por uno o ms dgitos.
Inicialmente tienen valores asignados cuando comienzas a ejecutar el
script.
De esta forma:
El parmetro 0 contiene el nombre del script y secuencialmente desde
1 en adelante los valores que hayamos puesto como argumentos en
orden.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.6.- SHELLSCRIPTS : Parmetros de un script.
Siguiendo con la ltima clase de parmetros:
Parmetros especiales.
Son aquellos que son denotados por los caracteres: * @ # ? - !. Estos
parmetros toman automticamente los valores siguientes:
# Nmero de parmetros posicionales que se han
dado de alta.
@ Contiene los parmetros posicionales que se han
dado de alta
* Contiene tambin los parmetros posicionales
que se han dado de alta, con otro formato.
- Contiene las opciones suministradas por ksh,
cuando se invoca o va el comando set.
? Valor de retorno del ltimo comando ejecutado,
funcin o programa, 0 indica terminacin correcta
y distinto de cero incorrecta.
$ Contiene el identificador de proceso del script.
! Nmero de identificador de proceso del ltimo
proceso en background.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.7.- SHELLSCRIPTS : Expansin de parmetros.
Formas de expansin de parmetros.
Se utiliza el carcter $ para hacer referencia al contenido de las variables.
$ { parmetro - palabra }
Esta expresin tiene el valor de parmetro si este est activo y si no lo est
ser palabra o su expansin.
$ { parmetro = palabra }
Esta expresin tiene el valor de parmetro si este est activo y si no lo est
contendr palabra o su expansin, adems en este caso asigna esto a
parmetro.
$ { parmetro ? palabra }
Esta expresin tiene el valor de parmetro si este est activo y si no lo est
contendr nulo y adems mandar palabra o su expansin al canal de error
estndar, causando la cancelacin del script y devolviendo valor false.
$ { parmetro + palabra }
Esta expresin tiene el valor de palabra si parmetro esta activo y si no lo
est asigna el valor nulo a la expresin.
En las cuarto posibilidades si se adjuntan dos puntos ( : ) entre parmetro y el
signo - = ? +, tomar no solo que est inactivo el parmetro, sino tambin que
contenga el valor nulo.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.8.- SHELLSCRIPTS : Atributos de los parmetros de un
script.
Se puede asignar a cada variable uno o ms de los siguientes atributos.
Cuando un atributo de una variable se cambia, el valor de la variable cambia de acuerdo
al nuevo atributo.
Para ello se utiliza el siguiente comando:
$ typeset -u | -l | -ibase | -Llong1 | -Rlong2 | -r | -x
nombre_variable
Cambia los atributos de nombre_variable aadiendo los que indiques segn los
argumentos que adjuntes.
Argumentos:
-u Cambia los caracteres de minsculas a maysculas
-l Cambia los caracteres de maysculas a minsculas
-ibase Cambia de base los enteros.
-Llong1 Hace que el parmetro tenga long1 caracteres justificado
a la izquierda.
-Rlong2 Hace que el parmetro tenga long2 caracteres justificado
a la derecha.
-r Hace que el parmetro sea solo de lectura.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.9.- SHELLSCRIPTS : Comando set 1.
El comando set es muy utilizado para la programacin de scripts su utilidad es variada.
$ set [ - | + ] [ aefnostuvx- ] [ -o opcin ] [ -A nombre ]
[ argumentos ]
Establece y gestiona algunas opciones del funcionamiento del intrprete.
OPCIONES:
Si incluimos el signo - interpretar ksh que se activa una opcin o
caracterstica si lo hacemos con el signo + ser desactivarla.
a Todas las variables que se den de alta a partir de
la invocacin del comando se exportaran al
entorno del script.
e Hace que si existe un error, se ejecute el comando
trap con la opcin ERR y salga inmediatamente.
f Desactiva la generacin de nombres de ficheros.
n Lee los comandos siguientes chequendolos
sintcticamente pero sin ejecutarlos.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.10.- SHELLSCRIPTS : Comando set 2.
$ set [ - | + ] [ aefnostuvx- ] [ -o opcin ] [ -A nombre ]
[ argumentos ]
Seguimos con ms opciones:
o Si lo utilizamos sin ninguna opcin ms, nos dar
las lista de las opciones activas de la shell donde
se ejecuta el script.
s Ordena los parmetros posicionales.
t Sale del script despus de leer y ejecutar un nico
comando.
u Trata el uso de los parmetros que no estn dados
de alta como un error.
v Imprime las lneas que se leen del script.
x Imprime los comandos y sus argumentos que se
estn ejecutando.
- Para borrar todos los parmetros posicionales.
-A nombre Para dar valores al vector llamado nombre, se
adjuntan los valores despus de la opcin.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.11.- SHELLSCRIPTS : Comando set 3.
$ set [ - | + ] [ aefnostuvx- ] [ -o opcin ] [ -A nombre ]
[ argumentos ]
-o opcin Establece opciones por defecto, muchas de ellas
se pueden establecer con signo - y una letra como
ya hemos visto, algunas otras son:
bgnice Todos los trabajos en background corrern con la
mnima prioridad.
ignoreeof La shell no terminar cuando reciba un EOF, sino
que se deber usar el comando exit.
noclobber Protege reescrituras indeseables cuando se
redirecciona la salida de los procesos.
nolog No graba las definiciones de las funciones en el
fichero .history.
Si no adjuntamos ninguna opcin al comando set listar todas las variables
activas.
Si no ponemos opciones pero si argumentos entonces asignar los argumentos
a los parmetros posicionales comenzando por 1 hasta el nmero de argumentos
que haya.
Para descartar parmetros posicionales ya establecidos se utiliza el comando shift
de la forma " shift num_param_posicionales_a_descartar ".
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.12.- SHELLSCRIPTS : Redirecciones en scripts.
Adems de las redirecciones normales utilizando <, <<, >, >>, 2>, 2>>; existen otras algo
ms complejas que vamos a tratar.
De igual forma se puede utilizar la forma num_descriptor_fichero <, adems de las
combinaciones con los dems smbolos.
< & palabra
En este caso la redireccin se har, primero expandiendo palabra y luego si
el valor expandido es:
Un nmero entonces ksh redirecciona el canal de entrada estndar
con el que identifica el nmero resultante.
Si es el signo - entonces cierra el canal de entrada estndar.
> & palabra
Es semejante al anterior pero con el canal de salida estndar.
< > palabra
Abre el fichero con el nombre resultante de la expansin de palabra para
lectura y escritura como entrada estndar.
> | palabra
Hace lo mismo que > con la particularidad de que si el fichero al que se
expande palabra existe y la opcin noclobber est activa da error y si no
borrara el contenido.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.13.- SHELLSCRIPTS : Escritura en canales.
El comando ms utilizado de escritura es el comando echo pero es un subconjunto del
comando print que ahora veremos.
print [ -rsu ] [ num ] argumentos
Escribe en la salida estndar o donde le indiquemos, los argumentos que le
aportemos.
Dentro de los argumentos y entre comillas podemos indicar algunos caracteres de
escape como por ejemplo:
\a Carcter de aviso.
\b Retroceso.
\n Nueva lnea.
\r Tecla de RETURN.
\t Marca de tabulador.
Podemos utilizar las siguientes opciones con el comando.
r Para no poder utilizar los caracteres especiales \.
s Para escribir en el fichero .history.
u num Para escribir en el fichero con identificador num.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.14.- SHELLSCRIPTS : Lectura por canales.
El comando utilizado para esto es read pero antes vamos a hacer mencin al comando
exec.
exec redireccin | comando [ argumentos ]
Si utilizamos la forma comando con argumentos entonces ese comando con sus
argumentos se solapa con la shell activa que en ese momento este ejecutando el
script.
La funcionalidad del comando que nos interesa es la siguiente, cuando indicamos
una redireccin, estamos abriendo, cerrando y/o copiando descriptores de ficheros
que han sido especificados por medio de una redireccin de entrada/salida.
Estar activa esta redireccin hasta que termine el script, se mande el control a
otro programa o se cierre el canal redireccionado (se cierra ejecutando el
comando exec canal_a_cerrar <&-).
read [ -rsu ] [ num ] parmetros
Se utiliza para leer una lnea y partirla en campos, usando el carcter de
separacin por defecto, en condiciones normales es el espacio en blanco.
Cada campo se asociar a cada parmetro consecutivamente.
Cuando el comando encuentra un carcter de nueva lnea (\n), no lo toma
en cuenta y sigue leyendo de la siguiente lnea.
Las opciones tienen el mismo significado que en el comando print.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.15.- SHELLSCRIPTS : Comandos de control de ejecucin.
En esta parte del captulo los comandos que se pueden utilizar en scripts para controlar
la ejecucin de este.
Comandos como continue, break, exec seran de este tipo pero se ven en otras partes del
captulo.
eval argumentos
Se utiliza para la construccin de comandos y afecta a la ejecucin normal de un
script de la siguiente forma:
Si tu deseas ejecutar un comando contenido en una variable, en general en un
parmetro, se debe utilizar el comando eval, eval expande los argumentos
aportados concatenndolos con blancos y luego ejecutando todo el resultado
como un nuevo comando.
De esta forma los argumentos se expanden dos veces.
exit nmero
Causa la salida de la shell activa.
El nmero es el valor de retorno que se podr tratar en la variable de la shell
desde donde se ha lanzado el script.
return nmero
Se utiliza en funciones para devolver el control al script que le a dado el control.
Es semejante a el comando exit.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.16.- SHELLSCRIPTS : Captacin de seales.
Hemos comentado que cuando se acaba un proceso este genera una seal que puede
ser procesada.
Siguiendo con los comandos que estn relacionados con el control de la ejecucin de
un script veremos el comando trap que gestiona las seales que generan los procesos.
trap accin condicin
Especifica una accin a ejecutar cuando alguna condicin de las aportadas es
alcanzada.
Si la accin es un comando, entonces la shell ejecuta este comando cada vez
que alguna condicin es alcanzada y lo hace a la vez que es alcanzada.
Si la accin es es un guin ( - ), o es omitida, entonces hace que la condicin
que ha hecho que el comando trap se ejecute, se desactive.
Si no se da ni accin ni condicin se mostrar las condiciones activas con sus
acciones asociadas.
La condicin puede ser:
Una seal que produce el proceso, las seales se pueden listar con la orden
kill -l.
ERR. Ksh ejecuta la accin cuando un comando devuelve un valor distinto
de cero.
EXIT 0. Justo antes de cancelar el proceso del script se ejecuta la accin
indicada.
DEBUG. Ksh ejecuta la accin despus de cada comando simple.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.17.- SHELLSCRIPTS : Creacin de funciones.
Se pueden definir dentro de un script una funcin con el siguiente formato:
function identificador
{
...
}
identificador parmetros
Primero se define la funcin con los comandos integrantes entre llaves y luego
no hay ms que invocarla en el script por medio de su identificador.
La gestin de la ejecucin de un script hace que cuando un comando no se
encuentra, ksh chequea si ese nombre es una funcin si lo es se ejecutar
el cdigo de ella.
Se pueden compartir entre la funcin y el script los siguientes elementos:
Valores de variables y atributos de ellas, exportndolas adecuadamente.
Directorio de trabajo.
Alias definidos.
Los comandos trap activos excepto las de ERR y EXIT.
El parmetro especial $.
Los ficheros abiertos.
En cambio no se puede utilizar:
Parmetros posicionales.
El parmetro especial #.
El valor de retorno de una funcin ser el valor de retorno del ltimo comando
ejecutado en la funcin.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.18.- SHELLSCRIPTS : Expresiones aritmticas.
Veamos ahora brevemente algunos conceptos relacionados con expresiones aritmticas
en scripts.
Para comenzar las constantes en un script son de la forma:
[ base # ] nmero
Si no indicamos la base entonces se entender que es base 10.
En el caso que utilicemos algn comando con algn argumento que sea un nmero,
la shell har lo siguiente si es una constante la utilizar si no lo es entender que es
una expresin numrica con lo que intentara evaluarla mediante unas ciertas reglas.
Las reglas que se utilizarn para evaluar las expresiones son semejantes a las utilizadas
en lenguaje C.
El comando que evala expresiones aritmticas es let y como extensin expr.
let argumentos
Se usa para evaluar una o varias expresiones aritmticas.
Se puede utilizar de igual forma el doble parntesis, ya que es similar en su
funcin.
expr argumentos
Evala argumentos de una expresin, con este comando se puede evaluar
tambin por ejemplo la longitud de una expresin, posicin dentro de una
cadena, etc.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.19.- SHELLSCRIPTS : Evaluacin de condiciones 1.
Para la construccin de algunos comandos es necesario incluir expresiones
condicionales, para esto se utiliza el comando test.
test [ expresin ]
Se utiliza para evaluar una condicin que puede ser aritmtica o no.
Se puede utilizar de forma equivalente suprimiendo la palabra test por la
expresin escrita entre corchetes.
Se puede utilizar para comprobar el tipo de un fichero, si una cadena de
caracteres es de cierta longitud, comparaciones numricas, etc; veamos
algunos casos concretos.
Sobre ficheros:
-r fichero Comprueba si el fichero tiene el permiso de
lectura, de igual forma ser con w escritura y
x ejecucin.
-f fichero Da verdadero si fichero es un fichero normal.
-d fichero Responde valor verdadero si fichero es directorio.
-c fichero Verdadero si es fichero de caracteres especiales.
-f fichero Verdadero si es fichero pipe ( fichero cola ).
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.20.- SHELLSCRIPTS : Evaluacin de condiciones 2.
Seguimos con ms opciones sobre ficheros:
-u fichero Verdadero si fichero tiene el bit de usuario activo.
-g fichero Verdadero si fichero tiene el bit de grupo activo.
-k fichero Verdadero si fichero tiene el sticky bit activo.
-s fichero Verdadero si fichero tiene tamao mayor que cero.
-L fichero Verdadero si fichero es un enlace simblico.
-O fichero Verdadero si fichero tiene el usuario efectivo igual
a su dueo.
-G fichero Verdadero si fichero tiene el grupo efectivo igual
al grupo que est adscrito.
-S fichero Verdadero si es fichero tipo socket.
-t [ num ] Verdadero si el fichero cuyo nmero descriptor es
num est abierto y asociado con un dispositivo de
terminal.
Vemos tambin opciones sobre cadenas de caracteres:
-n cadena Verdadero si la longitud de la cadena es distinta
de cero.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.21.- SHELLSCRIPTS : Evaluacin de condiciones 3.
Y terminando con las opciones:
-z cadena Verdadero si la longitud de la cadena es cero.
-o opcin Verdadero si la opcin est activa ( vase
comando set ).
Tambin se puede comparar expresiones alfanumricas haciendo su traduccin
mediante la codificacin ascii a enteros, para ello se utilizan los signos: =, igual;
!=, distinto; <, menor que; >, mayor que.
Verificando si un fichero1 es con respecto a fichero2:
-nt Ms reciente.
-ot Ms antiguo.
Comprobando expresiones aritmticas formadas por los operadores -eq, -ne, -gt,
-ge, -lt, -le.
Se pueden utilizar parntesis para agrupar expresiones y para la conexin entre
expresiones se utiliza los operadores:
-a Operador binario "y".
-o Operador binario "o".
! Operador unario negacin.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.22.- SHELLSCRIPTS : Comandos condicionales 1.
Primero veremos el comando condicional por excelencia que es "if".
if [ expresin1 ]
then [ comandos1 ]
[ elif [ expresin2 ]
then [ comandos3 ] ]
. . .
[ else [ comandos4 ] ]
fi
El control de la ejecucin ser el siguiente, si se cumple expresin1 se ejecutarn
los comandos1 y nada ms, si no se cumple y en cambio si se cumple expresin2
se ejecutarn los comandos2 exclusivamente y as sucesivamente, si no se cumple
ninguna condicin se ejecuta comandos4.
Las expresiones son construcciones del tipo test, [ ], o incluso comandos tomando
el valor de retorno como boleano, el intrprete intentar expandir lo ms posible
estas expresiones antes de valorar si son verdaderas o falsas.
Se puede utilizar el signo ( : ) para indicar que la lista de comandos es vaca.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.23.- SHELLSCRIPTS : Comandos condicionales 2.
Otro comando condicional implementado en ksh es "case".
case palabra in
[ [ ( ] patrn1 [ | patrn2 ] ). . . ) lista_comandos1 ;; ]
[ [ ( ] patrn3 [ | patrn4 ] ). . . ) lista_comandos2 ;; ]
. . .
esac
Ksh ejecuta la lista_comandos que este asociada al primer patrn que sea
cumplido por palabra.
El interprete expande palabra todo lo posible antes de comenzar la bsqueda
del patrn.
Los patrones se pueden formar con la tcnica de generacin de ficheros y no
con expresiones regulares.
El smbolo ( | ) quiere decir que puede darse cualquiera de los patrones
relacionados separados con el smbolo de pipeline.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.24.- SHELLSCRIPTS : Comandos iterativos 1.
Veamos los comandos para implementar bucles.
for identificador [ in lista ]
do
lista_de_comandos
done
Cada vez que lista_de_comandos es ejecutada, el identificador toma el
valor del siguiente campo contenido en lista, se pueden utilizar caracteres
de generacin de ficheros en la construccin de la lista.
Si no se incluye "in lista", se ejecuta el comando "for" con los parmetros
posicionales.
La ejecucin termina cuando no hay ningn campo en la lista o no queda
ningn parmetro posicional.
En los comandos de iteracin se puede utilizar los comandos:
break [ n ]
Sale del comando de iteracin despus de n ejecuciones.
continue [ n ]
Causa la repeticin de la ejecucin del bucle n veces.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.25.- SHELLSCRIPTS : Comandos iterativos 2.
select palabra in lista
do
lista_de_comandos
done
Visualiza cada uno de los campos de lista en una o varias columnas en el canal
de error estndar, numerndolos y finalmente mostrando el prompt PS3.
Entonces el intrprete lee una entrada del usuario por el canal estndar de entrada
y si esa entrada es igual a uno de los nmero en que ha sido numerada la lista,
entonces la palabra tomar el valor del campo seleccionado y comenzar la
ejecucin de lista_de_comandos.
La lista_de_comandos se ejecutar repetitvamente hasta que se encuentre un
comando break, exit o return dentro de lista_de_comandos o se le introduzca un
final de fichero.
Cuando se introduzca el carcter nulo volver a preguntar por la seleccin y si no
se indica un nmero de seleccin valido se le asigna null.
La respuesta del usuario se cargar en la variable REPLY.
La utilizacin del comando break har que salga del bucle el control de programa.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.26.- SHELLSCRIPTS : Comandos iterativos 3.
Otras implementaciones de bucles son:
while condicin
do
lista_de_comandos
done
Hace que se ejecute la lista_de_comandos mientras se cumpla la condicin
especificada.
La condicin se construye por medio del comando test y similares, se
comprueba antes de la ejecucin de cada bucle.
until condicin
do
lista_de_comandos
done
Hace que se ejecute la lista_de_comandos hasta se cumpla la condicin
especificada.
La condicin se construye por medio del comando test y similares, se
comprueba al final de la ejecucin de cada bucle.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
1.27.- SHELLSCRIPTS : Comandos miscelneos.
umask nmero
Para que se de de alta por defecto los ficheros con permisos con el
complementario de nmero en octal.
ulimit num
Establece el tamao mximo de los ficheros que crees a num bloques de medio
Kbyte, si no indicas num te muestra el lmite actual.
tset opciones
Inicializa el terminal cuando haces login en tu equipo, consultando el fichero
/usr/lib/terminfo, donde se encuentran todos los tipos de terminales.
stty opciones caracteres
Asocia opciones a caracteres y pone activas otras opciones.
Por ejemplo:
stty erase "^?" kill "^C" -ixoff.
Tambin es posible ver las asociaciones ya existentes si utilizas el comando sin
opciones.
tabs
Establece los tabuladores por defecto.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.1.- COMPILACION : Introduccin al proceso de compilacin.
Conceptos
El proceso de compilacin trata de crear un fichero que pueda ser directamente
ejecutado por el ordenador tomando como partida un fichero texto codificado en un
lenguaje de programacin conocido por la persona que realiza esta operacin.
Frente a este concepto de compilacin existe otro de interpretacin que se basa en
tomar cada una de las ordenes que se deban de ejecutar del fichero fuente de
texto en cdigo en lenguaje de programacin, traducirlas a ordenes directamente
comprensibles por la mquina y por fin ejecutarlas una a una despus de este
proceso.
Llamaremos compilador al programa que crea el fichero objeto ejecutable desde el
fichero fuente de texto codificado en algn lenguaje de programacin.
Debemos tener en cuenta que el cdigo que genera el compilador es cdigo
mquina y es diferente dependiendo de en que mquina estemos trabajando,
es por esto que el compilador de un lenguaje en concreto sea diferente para
cada mquina, lo que se puede esperar de un compilador y sus herramientas
complementarias es que cumplan la gua de portabilidad de software XPG3 o
en su caso su versin anterior XPG2.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.2.- COMPILACION : El entorno de programacin.
Vemos que las herramientas que nos ofrece un sistema operativo para desarrollar
programas depende de dos cuestiones:
Tipo de mquina con la que trabajamos, caractersticas de ella, formato de
su cdigo fuente, etc ( en algunos casos se tiene posibilidad de utilizar
optimizadores de cdigo por ejemplo ).
El lenguaje de programacin empleado ya que cada lenguaje tiene
diferentes ordenes y formas de implementar una misma abstraccin de la
realidad ( pensemos por ejemplo en las diferencias entre el anlisis de una
aplicacin con filosofa orientada a objetos, basada en tiempo real o la
general utilizando programas imperativos ).
Lo que hace referencia a estos dos puntos en el curso utilizaremos:
Una mquina Unix de la marca HP, servidor de la serie 800 modelo E35,
con lo que habr momentos en que lo que digamos no ser del todo general
a toda mquina Unix, se intentar que sea lo menos posible, y que en otros
sistemas Unix haya equivalencias.
Utilizaremos lenguaje C, y metodologa de diseo imperativa o no orientada
a objetos, el compilador que utilizaremos soporta el C desarrollado por
Kernigan y Ritchie y el ANSI C.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.3.- COMPILACION : Partes del proceso de compilacin 1.
Fases de la compilacin
La tarea de compilacin se divide en varias fases y esto tambin depende del
lenguaje que utilices y que recursos te ofrezca, pero lo que es comn en todo
proceso de compilacin son dos fases:
Para cada fichero fuente, el compilador crea un fichero objeto, con el cdigo
mquina correspondiente a ese fichero fuente, funcin que desarrolla el
propio programa compilador, con el ejecutable ccom.
Despus se crea un ejecutable con todos los ficheros objetos que tengamos,
resolviendo las llamadas que se den entre ellos, funcin que desarrolla el
editor de enlaces o enlazador, mediante llamada del compilador o
invocndolo explcitamente, con el comando ld.
Ademas existen otras partes en la compilacin dependiendo del lenguaje que
estes utilizando.
En nuestro caso, en el entorno Unix HP y programando en C, podremos utilizar:
Preprocesamiento del cdigo en C para resolver tareas previas a la
compilacin, comando cpp.
Procesamiento de macros, comando m4.
Generacin de cdigo en ensamblador, comando ccom, y posterior
compilacin del cdigo en lenguaje ensamblador, comando as.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.4.- COMPILACION : Partes del proceso de compilacin 2.
Otros comandos asociados al proceso de compilacin.
Herramientas tiles en el proceso de compilacin pueden ser:
Reformar el programa fuente para hacerlo mas legible, comando cb.
Comprobar el cdigo del programa sin compilarlo, comando lint.
Generacin del grfico de control de programa, comando cflow.
Generacin de la tabla de referencias cruzadas, comando cxref.
Visualizar los smbolos definidos en un fichero objeto, comando nm.
Depurar el programa de posibles errores de ejecucin, comando xdb.
Despus de compilado se puede generar el perfil del programa, comandos
prof y gprof.
En este captulo vamos a tratar las utilidades que utilizamos para generar un
programa correctamente escrito que sea susceptible de una buena compilacin,
otro problema ser que ese ejecutable no genere errores en su ejecucin o no
realize lo que nosotros queramos, las utilidades encuadradas en este tema seran
de las expuestas, el depurador xdb y los generadores de perfiles que se estudian
en temas separados.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.5.- COMPILACION : Fichero fuente, objeto y ejecutable.
Conceptos.
Se llama fichero fuente al fichero de texto que contiene las ordenes en un lenguaje
de programacin de alto nivel y es susceptible de traducirse a un formato
comprensible por la mquina directamente.
La notacin de los ficheros fuente depende del lenguaje de programacin en los
que estn escritos, para una mayor normalizacin se utilizan los sufijos .c
programacin en C, .f programacin en Fortran y .p programacin en Pascal.
Un fichero objeto es bsicamente un fichero que contiene instrucciones de
lenguaje mquina y variables de forma que el editor de enlaces pueda usarse
para generar un fichero ejecutable.
Por defecto y para normalizar la notacin se denominan los ficheros objetos con el
sufijo .o.
Un fichero ejecutable es aquel que no necesita ningn proceso de transformacin
para que la mquina lo procese directamente.
La notacin utilizada para los ficheros ejecutables es aadiendo el sufijo .out o
.exe.
La nica diferencia entre fichero objeto y un ejecutable es que el primero puede contener
referencias a otros ficheros objetos que no se pueden solucionar directamente
ejecutando ese fichero y en cambio esto ya no sucede en un fichero ejecutable.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.6.- COMPILACION : Smbolos de un fichero objeto.
Cada rutina o unidad de datos definida en un fichero objeto tiene su correspondiente
nombre de smbolo por el cual se puede referenciar.
Un fichero objeto tiene asociada su tabla de smbolos, el editor de enlaces utiliza esta
tabla para montar las asociaciones que se utilizarn al generar el fichero ejecutable.
Tipos de smbolos.
Definiciones locales:
Variables y rutinas que solo son accesibles desde nuestro fichero objeto y
no desde otro externo.
Definiciones globales:
Procedimientos, funciones, o elementos de datos que son accesibles por el
cdigo de otro fichero objeto donde est definido.
Cada lenguaje de programacin genera definiciones globales o locales
segn sean variables de un tipo u otro, en el caso de C genera definiciones
globales para todas la variables y funciones que no estn definidas como
static.
Referencias externas:
Son indicaciones o apuntadores a definiciones globales de otros ficheros
objeto. Es en el paso del editor de enlaces cuando se resuelven estas
direcciones.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.7.- COMPILACION : Comando cb.
Es una utilidad que se usa para modificar el cdigo fuente con el propsito de hacerlo
ms legible.
Esto puede ser muy importante a la hora de mantener un programa, si se tiene que
modificar este cdigo.
$ cb [ -j ] [ -l longitud ] [ fichero . . . ]
Lee un programa escrito en C, si se especifica uno o ms ficheros ser este el
programa o por defecto del canal de entrada estndar, y lo reproduce modificado
en el canal de salida estndar.
Le inserta espacios en blanco e indentacin apropiada a la programacin C.
Por defecto cb no modifica las entradas del usuario que no sean cdigo de
programacin.
OPCIONES:
-j Hace que las lneas partidas de instruccin se
vuelvan a poner en la misma lnea.
-l longitud Hace que parta las lneas de mayor longitud que la
indicada.
No parte indiscriminadamente las lneas sino que
se mantiene la legibilidad del fichero por el
compilador.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.8.- COMPILACION : Comando lint 1.
Introduccin al comando lint
En algunos momentos puede ser til poseer un programa que nos chequee un
programa fuente para informarnos de las "pegas" que puede tener, errores,
mensajes de aviso, etc, pero todo esto sin intentar generar el cdigo ejecutable del
programa, ya que esto es ms costoso que simplemente comprobar la correccin
del programa.
Por estos motivos se muy recomendable la utilizacin regular de este programa de
utilidad.
Esta utilidad detecta diversas caractersticas de los programas escritos en C que
estn incluidos en los ficheros que se relacionen en el comando.
Reconoce errores en los programas, problemas de portabilidad con otros
compiladores C, incluso cdigo intil en ejecucin.
Ejemplos de estas caractersticas que se detectan son:
- Ordenes que no se ejecutan nunca.
- Bucles sin condicin de salida.
- Variables declaradas y no usadas.
- Expresiones lgicas de valor constante durante todas las ejecuciones
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.9.- COMPILACION : Comando lint 2.
$ lint [ -abhuvx ] [ -lletra ] [ -n ] [ -p ] [ -s ] [ -c ] [ -olib ] [ -Amodo ]
[ fichero . . . ]
Chequea cdigo de programacin en C.
Los ficheros que indiquemos en el comando deben tener el sufijo .c, para indicar
que son fuentes en C, tambin procesa ficheros con sufijo .ln que son creados por
este comando con las opciones -c -o, estos ficheros son parecidos a los ficheros .o.
Lint tambin utiliza unas libreras especificas de funciones que tiene los nombres
de llib-lx.ln con x siendo una letra la librera por defecto a incluir es llib-lc.ln, lo que
hace es aadir al final de la lista de los ficheros indicados esta librera.
Chequea los programas en dos partes la primera individualmente y la segunda
comprueba la compatibilidad entre ellos.
OPCIONES:
Con las siguientes opciones se suprimen diversas comprobaciones:
-a Truncamientos.
-b Comandos break nunca utilizados.
-h Avisos de mal estilo y no optimizacin.
-u Funciones no definidas o no usadas.
-v No utilizacin de argumentos en funciones.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.10.- COMPILACION : Comando lint 3.
$ lint [ -abhuvx ] [ -lletra ] [ -n ] [ -p ] [ -s ] [ -c ] [ -olib ] [ -Amodo ]
[ fichero . . . ]
Algunas opciones relacionadas con la portabilidad de los programas:
OPCIONES:
-lletra Incluye en la segunda parte de la comprobacin la
librera llib-lletra.ln que es una versin especial de
la librera libletra.
-n No comprueba la compatibilidad con las libreras
propias llib-lletra.ln.
-p Comprueba la portabilidad con otras versiones
de C.
-s Comprueba cuestiones relacionadas con punteros
y estructuras de datos respecto de la portabilidad
de los programas.
-c Produce la creacin de un fichero con sufijo .ln por
cada .c, solo se comprueba la primera fase del
comando.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.11.- COMPILACION : Comando lint 4.
$ lint [ -abhuvx ] [ -lletra ] [ -n ] [ -p ] [ -s ] [ -c ] [ -olib ] [ -Amodo ]
[ fichero . . . ]
OPCIONES:
-olib Hace que se cree una librera llib-llib.ln y se
incluyan los ficheros .ln que se creen
correspondientes a los .c.
-Amodo Indica el estndar de compilacin.
Modo puede ser uno de estos dos valores:
c Compilador de C de HP anterior a la
versin 7.0.
a Compilador estndar ANSI para C
desarrollado en 1988.
Se pueden incluir algunas opciones del comando cpp y de cc incluso se
puede comprobar portabilidad con otros estndares de programacin C,
POSIX incluye un estndar de lenguaje C.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.12.- COMPILACION : Comando cc 1.
El comando cc en realidad es un cargador que ejecuta otros comandos como son el
preprocesador cpp, el compilador propiamente dicho ccom, el ensamblador as y el editor
de enlaces ld.
Es la parte fundamental del proceso de compilacin y sus parmetros son comunicados a
los diferentes comandos que se lanzan posteriormente.
$ cc [ opciones1 ] [ fichero . . . ] [ opciones2 ]
El compilador de C utiliza ficheros de diferentes procedencias y caractersticas,
algunos ejemplos de estos son ficheros .c de fuentes de C, .o de ficheros objetos,
.s de ficheros en lenguaje ensamblador, .i de ficheros ya preprocesados con cpp,
.a para libreras de funciones de tipo archivo y .sl para las que sean compartidas.
Los ficheros que se insertan en el comando pueden ser fuentes de C, ficheros ya
preprocesados, ficheros en ensamblador o ficheros objeto, a cada uno de ellos
tienen un tratamiento diferente, se trata de generar si no lo est su fichero objeto
correspondiente y luego invocar el editor de enlaces para generar el ejecutable.
Para el funcionamiento del compilador se utilizan ficheros temporales situados en
/tmp o /usr/tmp.
De forma general se puede incluir en la variable de shell CCOPTS las opciones a
utilizar por el compilador, incluyendo un pipeline en ella, el programa reconoce las
opciones insertadas antes del pipeline como incluidas antes del nombre de fichero
y las siguientes despus.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.13.- COMPILACION : Comando cc 2.
$ cc [ opciones1 ] [ fichero . . . ] [ opciones2 ]
Las opciones que veremos aqu son generales y de uso comn en el proceso de
compilacin.
OPCIONES:
-Amodo Especifica el estndar de compilacin que se
utilizar.
c Compila con las versiones anteriores
del C de HP-UX versin 7.0.
a Compila bajo las especificaciones
ANSI de programacin C,
ANS X3.159-1989.
-onombre Nombra el fichero ejecutable con el indicado, por
defecto el fichero se llamar a.out.
-v Te muestra las fases de compilacin en el canal
de errores.
-O Invoca con ello al optimizador del compilador,
hay muchos modos de optimizacin utiliza el nivel
2 por defecto.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.14.- COMPILACION : Comando cc 3.
$ cc [ opciones1 ] [ fichero . . . ] [ opciones2 ]
Tenemos alguna opcin ms que involucra a todas las fases del proceso de
compilacin.
OPCIONES:
-tletra,proceso Cambia el programa que se ejecutar en una de
las fases de compilacin, incluyendo como letra
una de las fases del proceso de compilacin:
p Fase de preprocesamiento.
c Fase de compilacin.
a Fase de ensamblador.
l Fase de enlazado.
Y como proceso el programa que se lanzar en
esa fase. Por defecto ya sabemos que p tiene
asociado cpp, c ccom, a as y l ld.
-Wletra,opcion1,... Te permite pasar opciones a los programas
utilizados en la fase de compilacin que refiera
letra.
Se puede adjuntar ms de una opcin separada
por comas.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.15.- COMPILACION : Comando cc 4.
$ cc [ opciones1 ] [ fichero . . . ] [ opciones2 ]
Opciones que suprimen fases o generan ficheros especiales que se pueden tratar
con herramientas especiales.
OPCIONES:
-c Suprime la fase de enlace y fuerza que cada
fichero .c produzca un fichero .o.
-S Produce el cdigo en lenguaje ensamblador del
programa en C que le indiquemos, el fichero
resultante lo nombrar con el sufijo .s.
-g Opcin para utilizar el depurador simblico con el
ejecutable que obtengamos.
-G Opcin para utilizar el generador de perfiles gprof
con el ejecutable que obtengamos.
-p Opcin para utilizar el generador de perfiles prof
con el ejecutable que obtengamos.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.16.- COMPILACION : Comando cc 5.
$ cc [ opciones1 ] [ fichero . . . ] [ opciones2 ]
Las siguientes tratan de modificar el comportamiento de preprocesador en la
primera fase de la compilacin.
OPCIONES:
-Dnombre = def Similar a una clausula #define dentro del
programa fuente que ser procesada por el
preprocesador.
-Unombre Borra cualquier asignacin precedente de nombre
que fuera a ser tratada con cpp.
-Idirectorio Cambia la forma de bsqueda de los ficheros de
cabecera que incluimos en las entradas #include
tratadas por el preprocesador, primero ir a
buscarlos al directorio especificado.
-E Hace que se ejecute el preprocesador cpp y
manda el resultado por el canal de salida
estndar.
-P Hace que se ejecute el preprocesador cpp y
el resultado lo nombra igual que el nombre del
fichero con el sufijo .i.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.17.- COMPILACION : Comando cc 6.
$ cc [ opciones1 ] [ fichero . . . ] [ opciones2 ]
Y estas hacen referencia al editor de enlaces, que es la ltima fase del proceso de
compilacin.
OPCIONES:
-Ldirectorio Cambia la bsqueda se las libreras que se
utilizarn en el paso del editor de enlaces, por
defecto las ir a buscar al directorio especificado,
hay mltiples directorios que tienen libreras
"paralelas" a las utilizadas por defecto.
-n Hace que el ejecutable sea compartible.
-N Hace que el ejecutable sea no compartible.
-q Marca el ejecutable como cargable bajo peticin.
-Q Marca el ejecutable como no cargable bajo
peticin.
Todas estas opciones son propias de los equipos Unix de la marca HP, hay otras
opciones que son propias de la serie de ordenadores dentro de HP.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.18.- COMPILACION : Comando cpp 1.
La primera invocacin que hace normalmente el compilador es la del preprocesador, en
el entorno que estamos trabajando el preprocesador ms utilizado es el comando cpp,
pero tambin existen otros, por ejemplo el comando m4 que es un preprocesador ms
general para lenguajes C, Ratfor, y otros, mientras que cpp es exclusivo para C.
Cpp es utilizado por defecto en el proceso de compilacin como primera fase al tratar
programas fuente en C.
El propsito de cpp es tratar las entradas de compilacin marcadas con el smbolo #, que
pueden ser inclusiones de cdigo, instrucciones condicionales de compilacin o proceso
de macros, luego veremos con ms detenimiento estas actuaciones.
El comando cpp se encuentra en el directorio /lib lo que puede ocasionar que si esa
direccin no esta incluida en la variable PATH no encuentre el comando, siempre se
tiene la opcin de invocar el comando con la direccin completa /lib/cpp.
Este es el formato de la invocacin del comando cpp:
$ cpp [ -P ] [ -Unomb1 ] [ -Dnomb2=def ] [ -Idir1 ]
[ fich_ent [ fich_sal ] ]
Ya hemos comentado lo que haca el comando, el propsito que tiene el
preprocesar un fuente antes de compilarlo est en que puede que segn el
compilador que utilicemos ( incluso en la mquina que estemos utilizando )
queramos incluir un cdigo u otro o insertar cdigo ya escrito o hacer cambios
globales en el fuente.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.19.- COMPILACION : Comando cpp 2.
$ cpp [ -P ] [ -Unomb1 ] [ -Dnomb2=def ] [ -Idir1 ]
[ fich_ent [ fich_sal ] ]
El fich_ent ser el que contenga el fuente en C y si incluimos fich_sal se crear
este, conteniendo el fuente modificado por el preprocesamiento, por defecto el
comando utiliza los canales estndar de entrada y salida.
OPCIONES:
-P Suprime la lnea de control que proporciona el
preprocesador por defecto.
-Unomb1 Borra las definiciones iniciales que tuviera nomb1.
Existen smbolos reservados para indicar al
compilador la mquina que se esta utilizando o el
tipo de procesador incluso la versin del sistema
operativo, estos smbolos son susceptibles de ser
tratados por esta opcin.
-Dnomb2=def Similar a una clausula #define en el cdigo fuente,
cambia en el cdigo la palabra nomb2 por def.
-Idir Modifica el defecto de bsqueda de los ficheros
que se tratarn con la clausula #include tomando
como primer directorio de bsqueda el directorio
indicado dir.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.20.- COMPILACION : Comando cpp 3.
$ cpp [ -P ] [ -Unomb1 ] [ -Dnomb2=def ] [ -Idir1 ]
[ fich_ent [ fich_sal ] ]
Como se dijo cpp procesa en el cdigo fuente todas las entradas que posean
como primer carcter una almohadilla ( # ) seguida de un blanco o tabulador.
Las entradas mas usuales son las siguientes:
#define nom valor Cambia en todo el texto de C la cadena de
caracteres nom por valor.
#undef nom Desactiva la clasula #define asociada a nom a
partir de ese instante.
#include "fich" Incluye el cdigo del fichero fich en el fuente, la
#include <fich> diferencia entre la utilizacin de "" o <> es que las
primeras hacen que se empiece la bsqueda de
fich en el directorio donde tenemos el fuente y en
el otro caso no, directamente va a las direcciones
por defecto de bsqueda.
El lugar donde se encuentran los ficheros de
cabecera utilizados en programacin C es
/usr/include.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.21.- COMPILACION : Comando cpp 4.
$ cpp [ -P ] [ -Unomb1 ] [ -Dnomb2=def ] [ -Idir1 ]
[ fich_ent [ fich_sal ] ]
Siguiendo con las entradas que soporta cpp en el fuente:
#line num "fich" Incluye la lnea de control formada por num "fich".
Las siguientes entradas condicionales hacen incluir un determinado cdigo
u otro.
#if, #else, #endif Con la significacin normal utilizada en lenguajes
de programacin.
#ifdef nom , #ifndef nom Se incluirn las lneas si est o no tratada la
variable nom con una clasula #define activa o
no lo est.
La utilizacin del preprocesador cpp en el proceso de compilacin ( comando cc )
hace que por defecto se utilicen ficheros de entrada salida temporales para el
almacenamiento hasta que se utilice en otra fase, los ficheros temporales que se
utilizan estn en los directorios /tmp o /usr/tmp, y normalmente tienen como nombre
ctmAAAanum con num nmero secuencial.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.22.- COMPILACION : Comando as 1.
Toma el cdigo ensamblador generado por el compilador utilizando la opcin -S y
genera un fichero objeto .o que es susceptible de ser procesado por el editor de enlaces.
Es til cuando se trata de fraccionar el proceso de compilacin para introducir
modificaciones en algunas de las fases, por ejemplo modificar el programa en
ensamblador por algn motivo optimizar el cdigo o modificaciones difciles de
conseguir en un nivel superior de la programacin.
Los ficheros que son susceptibles de tratamiento por este comando son los de sufijo .s y
como ya hemos dicho se generan fichero .o.
$ as [ -A ] [ -afich_list ] [ -ofich_sal ] [ -e ] [ -f ] [ -l ] [ -s ]
[ fichero . . . ]
Traductor de bajo nivel, produce cdigo mquina desde cdigo de bajo nivel
o lenguaje ensamblador.
OPCIONES:
-A Produce por la salida estndar una lista de
cdigos de instruccin.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.23.- COMPILACION : Comando as 2.
$ as [ -A ] [ -afich_list ] [ -ofich_sal ] [ -e ] [ -f ] [ -l ] [ -s ]
[ fichero . . . ]
OPCIONES:
-afich_list Produce los mismos datos que con la opcin A
pero los carga en el fichero fich_list.
-ofich_sal El fichero objeto se graba con el nombre de
fich_sal por defecto el ensamblador lo genera con
el nombre del fichero en cdigo en ensamblador
modificando el sufijo por .o.
-e Aunque se produzcan errores el ensamblador
sigue trabajando, por defecto el ensamblador
tolera 100 errores.
-l Produce una lista por el canal de salida estndar
con las direcciones de las instrucciones y sus
valores actuales.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.24.- COMPILACION : Comando nm 1.
Otra herramienta de utilidad para el proceso de compilacin es el comando nm.
$ nm [ -hnopruvxV ] [ fichero . . . ]
Visualiza una lista de nombres de los ficheros objeto que se indiquen.
Aparece la siguiente informacin:
- Nombre del del smbolo.
- Direccin del smbolo.
- Alcance del smbolo ( Definicin esttica, externa, indefinida ).
- Tipo de smbolo ( cdigo, datos, etc ).
- Subespacio al que pertenece el smbolo ( regiones en las que se divide
el objeto ) puede ser $SHLIB_INFO$,, $MILLICODE$, $LIT$, $CODE$,
$UNWIND$, $GLOBAL$, $DATA$, $COMMON$, $SHLIB_DATA$, $BSS$.
OPCIONES:
-h No visualiza la cabecera de la lista.
-n Ordena las variables por nombre de forma
ascendente.
-o Muestra la direccin en octal.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.25.- COMPILACION : Comando nm 2.
$ nm [ -hnopruvxV ] [ fichero . . . ]
OPCIONES:
-p Cambia el formato de la salida incluyendo
direccin, nombre y una letra que caracteriza el
smbolo cuyos valores pueden ser:
T Definiciones globales.
U Referencias externas.
d Definiciones locales de datos.
b Definiciones local de datos no
inicializados.
-r Indica el objeto al que pertenece el smbolo que se
esta listando.
-u Muestra solamente los smbolos que estn
indefinidos.
-v Ordena los smbolos por la direccin.
-x Muestra la direccin en hexagesimal.
-V Muestra la versin del comando nm que ests
utilizando por el canal de errores.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.26.- COMPILACION : Comando cflow 1.
Otra herramienta accesoria que se puede utilizar tanto antes como despus del proceso
de compilacin es el comando cflow.
Su utilidad est en que genera un grfico de las referencias externas.
Esta utilidad analiza diversos tipos de ficheros como son fuentes de programacin C,
ficheros escritos en lex y yacc, ficheros en ensamblador y ficheros objeto.
$ cflow [ -r ] [ -ix ] [ -i_ ] [ -dnum ] [ fich . . . ]
Genera un grfico de las referencias a smbolos utilizadas en los ficheros
indicados, el grfico se mostrar por la salida estndar.
Lista las funciones e indica las rutinas utilizadas en cada una de ellas y luego va
desplegndolas estas en posteriores niveles.
OPCIONES:
-r Hace que aparezcan las referencias comenzando
por los niveles mas bajos hacia arriba.
-ix Incluye smbolos externos y datos de tipo global,
por defecto estos ltimos no se incluyen en el
grfico.
-i_ Incluye los nombres de smbolos que comienzan
con subrayado.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.27.- COMPILACION : Comando cflow 2.
$ cflow [ -r ] [ -ix ] [ -i_ ] [ -dnum ] [ fich . . . ]
Y la ultima opcin:
-dnum Hace que solo se examinen los num primeros
niveles de profundidad.
Un ejemplo de la salida que proporciona el comando es:
1 j: int, <dados.c 1>
2 main: int(), <dados.c 3>
3 n: int[], <dados.c 1>
4 i: int, <dados.c 1>
5 printf: <>
6 cursor: int(), <dados.c 21>
7 abs: <>
8 printf: 5
9 rand: <>
10 a: int, <dados.c 1>
La primera indicacin es un nmero de referencia, luego proporciona el nombre del
smbolo, su definicin si existe, y el lugar donde se encontr su definicin ( fichero y
lnea ).
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.28.- COMPILACION : Comando cxref.
Una utilidad para explorar las variables existentes en una aplicacin, aunque est
repartida en varios ficheros es cxref.
$ cxref [ -c ] [ -s ] [ -ofich ] [ -wnum ] [ fich . . . ]
Analiza los ficheros fich que se indican generando posteriormente una tabla de
referencias cruzadas.
Produce una lista con todas las variables de cada uno de los ficheros ( tipos de
variables auto, static y global ), la informacin que se incluye para cada variable es
fichero donde aparece, la funcin donde se encuadra y las lneas donde aparece
dicha variable, un asterisco indica la lnea donde se encuentra su definicin.
OPCIONES:
-c Visualiza la tabla de varios ficheros combinada es
decir mezcladas en una misma lista.
-s Suprime la primera lnea que indica cada lista a
que fichero se refiere.
-ofich Carga la salida en el fichero indicado.
-wnum Modifica la salida a num columnas, por defecto
utiliza 80 columnas.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.29.- COMPILACION : Comando ld 1.
Introduccin.
El ltimo paso dentro del proceso de compilacin es el de enlazar los ficheros
objetos ya creados con el propsito de generar un fichero ejecutable, el mismo
editor de enlaces se encarga de proporcionar formato ejecutable al fichero salida.
Esta funcin la ejecuta el comando ld que es el ya mencionado editor de enlaces,
El comando ld no es propio de ningn lenguaje sino de la mquina donde se
trabaje, ya que maneja ficheros objeto.
Funciones.
Internamente la funcin del comando es resolver las referencias de los smbolos
externos, asignacin de direcciones finales a los procedimientos y las variables,
revisar la correccin de estas asignaciones y gestionar la informacin que tratar
el depurador si se incluy esta opcin en la fase de creacin de los ficheros
objetos.
Si el editor de enlaces no pudiera resolver alguna de las referencias externas,
es decir no encontrar un smbolo global en otro fichero objeto para asociarlo,
generara un error de smbolo no satisfecho.
Puede darse el caso de compilar programas de diferentes lenguajes y luego
enlazarlos para crear un solo ejecutable, pero debemos de tener en cuenta que los
parmetros asignados a los smbolos y la forma que tiene el objeto de referenciar a
estos puede ser diferente.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.30.- COMPILACION : Comando ld 2.
Ficheros que utiliza.
El cdigo objeto que se trata en esta fase puede estar incluido dentro de un fichero
tipo .o tambin en un fichero tipo librera, ambos tipos de ficheros son
reconocidos por el comando ld.
Las libreras que se mencionan son agrupaciones de ficheros objeto, se estudiarn
con ms detenimiento en el captulo siguiente, pero digamos que el comando ld
solo carga el cdigo de las partes de estas libreras que son referenciadas en los
otros ficheros objetos.
Tipos de libreras hay dos, archivo y compartibles con sus sufijos caractersticos .a
y .sl.
Por defecto y en el entorno de HP-UX se utiliza en la fase de enlace un fichero
objeto llamado crt0.o que se encuentra en el directorio /lib, este fichero objeto
contiene el cdigo que deben ejecutar todos los programas al comenzar a correr
llamado punto de entrada, por ejemplo reciben los argumentos del programa si es
que los tiene. Este fichero si se utilizan las opciones para la utilizacin de los
generadores de perfiles se cambia por los ficheros mcrt0.o gcrt0.o.
Formato del comando.
$ ld [ opciones ] [ fich_obj. . . ] [ -lletra_lib ]
El comando ld se encuentra en el sistema en el directorio /bin.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.31.- COMPILACION : Comando ld 3.
$ ld [ opciones ] [ fich_obj. . . ] [ -lletra_lib ]
Ya hemos visto que hace el editor de enlaces veamos algunas opciones que
utiliza:
OPCIONES:
-ofich_sal Nombra el fichero ejecutable salida como fich_sal.
-cfich_opc El comando lee del fichero fich_opc las opciones
para el editor de enlaces.
-m Genera una lista de los smbolos existentes en el
fichero ejecutable con la regin a la que
pertenecen.
-t Te informa de los ficheros que esta procesando
cuando crea el ejecutable.
-usmbolo Opcin utilizada por el compilador por defecto con
el smbolo main. Produce que ese smbolo se
incluya como indefinido, y se intente buscar en las
libreras que le hayas incluido.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.32.- COMPILACION : Comando ld 4.
$ ld [ opciones ] [ fich_obj. . . ] [ -lletra_lib ]
Mencionamos opciones referentes al modo de ejecucin del fichero ejecutable que
generamos, el significado de los modos de ejecucin los explicaremos mas
adelante.
-n Asocia el nmero mgico SHARE_MAGIC al
ejecutable que estamos creando.
-q Asocia el nmero mgico DEMAND_MAGIC al
ejecutable que estamos creando.
-N Asocia el nmero mgico EXEC_MAGIC al
ejecutable que estamos creando.
Vemos ahora opciones referentes al tratamiento de las libreras con el editor de
enlaces:
-lletra Busca la librera libletra.a o libletra.sl,
dependiendo de otras opciones escoger una
u otra, y la incluye en el proceso de edicin de
enlaces, es decir busca en ella referencias
externas de los ficheros objetos para completar
el ejecutable.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.33.- COMPILACION : Comando ld 5.
$ ld [ opciones ] [ fich_obj. . . ] [ -lletra_lib ]
Por ltimo se muestran opciones asociadas con la bsqueda de las libreras a
utilizar:
-Ldir Cambia el defecto de bsqueda de las libreras a
incluir en el proceso de enlace, primero buscar
en la direccin dir indicada, el defecto del editor de
enlaces es primero buscar en /lib y luego /usr/lib.
Esta accin se puede conseguir tambin dando de
alta en la shell la variable LPATH.
-apalabra Selecciona el tipo de librera que se va a utilizar
segn la palabra que indiques de las siguientes:
archive Toma la librera tipo archivo
correspondiente y si no la encuentra
no incluye ninguna.
shared De igual manera que la anterior pero
con libreras compartidas.
Por defecto incluye la librera compartida si est y
si no la tipo archivo.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.34.- COMPILACION : Nociones sobre ejecucin 1.
Gestin de entradas y salidas.
El tratamiento prctico de las entradas y salidas a ficheros en ejecucin una vez
que ya has generado el fichero ejecutable se basa en las siguientes nociones:
- Las salidas se producen por asignacin de descriptores de fichero dados
de alta.
- Los canales estndar stdin, stdout y stderr tienen asignados como
descriptores de ficheros el 0, 1 y 2 respectivamente, con las rutinas de
entrada salida se puede dirigir informacin por esos canales, estos
descriptores se dan de alta al comenzar la ejecucin.
- Luego se dan de alta los descriptores redireccionados en la invocacin del
ejecutable, tambin se podran utilizar con tal de direccionar en el programa
informacin por estos descriptores ( para este camino es importante recordar
el tema del redireccionamiento tratado en el captulo primero ).
- Por fin se asignan los descriptores a los ficheros abiertos por programa, si
el fichero es genrico se puede pasar como parmetro al programa.
Recordar tambin las tcnicas de enlace ( ln o ln -s ) y movimiento de ficheros
tiles para la gestin posterior de los ficheros generados con los ejecutables.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
2.35.- COMPILACION : Nociones sobre ejecucin 2.
Modos de ejecucin. Nmeros mgicos.
Asignado a cada programa ejecutable hay un nmero mgico que determina como
debe ser cargado cuando se est ejecutando.
Los tres posibles modos o nmeros mgicos son SHARE_MAGIC,
DEMAND_MAGIC y EXEC_MAGIC, y su forma de actuar ser:
- SHARE_MAGIC:
El cdigo del programa ejecutable ser compartido pero los datos del
programa no, si existen dos procesos ejecutando el mismo programa
el primero de ellos se habr encargado de pasar todo el cdigo del
programa a memoria virtual y el segundo lo reconoce utilizando este
mismo cdigo.
- DEMAND_MAGIC:
Es similar al anterior con la diferencia de que el primer programa solo
carga la parte del cdigo que necesita, siendo el siguiente proceso el
que aprovecha esta parte del cdigo si la necesitara o cargara otra
parte segn su necesidad.
- EXEC_MAGIC:
No se comparte nada entre procesos, cada proceso carga el cdigo
del programa y no se comparte, este modo es ms propio de
estaciones de trabajo que no de servidores.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
3.1.- LIBRERIAS : Introduccin.
Conceptos.
Como ya hemos hecho referencia en el anterior captulo, las libreras son ficheros
conteniendo cdigo objeto agrupado en subrutinas o funciones que pueden ser
utilizado por otros programas.
Dichos ficheros tienen una estructura especial dependiendo del tipo de librera que
sea.
El ejemplo ms popular de libreras en Unix ( recordemos que UNIX est
desarrollado en C ), es la libc que es la librera estndar de funciones C, y
contiene subrutinas utilizables desde programas C, Fortran y Pascal para
hacer operaciones de entrada y salida.
Notacin.
La notacin estndar de libreras es la siguiente:
libpalabra.extensin
palabra Diferencia unas libreras de otras dando
idea de cual son sus funciones por ejemplo
libc.a librera de C.
extensin Indica el tipo de librera que estamos
denotando, puede ser .a si es tipo archivo o
.sl si es tipo compartida.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
3.2.- LIBRERIAS : Comando ld como enlazador.
$ ld [ opciones ] [ fich_obj. . . ] [ -lletra_lib ]
Lo que hace el comando ld es adjuntar las definiciones globales de algunos
smbolos de los objetos contenidos en las libreras y satisfacer con ellos las
referencias externas de los ficheros objetos de nuestro programa.
OPCIONES RELACIONADAS CON LIBRERIAS.
Recordando las opciones que se utilizaban en el comando ld tenemos que:
-lpalabra Te inclua la librera en el proceso de
enlazado.
-Ldireccin Buscaba todas las libreras en la direccin
indicada.
-atipo Seleccionaba un tipo de librera en
concreto.
Lenguajes.
En el proceso de edicin de enlaces hay algunas libreras que se incluyen por
defecto segn el compilador que lance el enlazador, por ejemplo en C el
compilador cc incluye por defecto la librera libc, de forma similar en Fortran se
incluye automticamente libcl, libisamstub y libc.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
3.3.- LIBRERIAS : Clases de libreras por su uso.
Para que se utilizan las libreras ?.
Podemos decir a que se pueden diferenciar dos formas de utilizacin de las
libreras dependiendo de quien las haya creado:
Por una parte como un elemento ms del desarrollo de una aplicacin, de
tal forma que el programador rene las funciones y subrutinas de utilizacin
ms frecuente, las compila e incluye dentro de una librera de utilizacin
local.
Por otra parte y la forma ms extendida, es como paquetes de funciones
desarrolladas por un fabricante u organizacin que proporcionan ms
posibilidades al trabajo de desarrollo en un cierto campo, por ejemplo
libreras de grficos, libreras de funciones estadsticas, libreras X y muchas
otras posibilidades.
Apuntes sobre esta clasificacin.
Con las de utilizacin local debemos tener en cuenta la ubicacin de estas
libreras y la forma de bsqueda que tiene el editor de enlaces para incluirlas en el
proceso ( variable LPATH y opcin -L en el comando ld ).
Estas dos formas de utilizacin que en el fondo tienen un manejo similar, solo que
si las libreras son locales, t podrs crearlas y mantenerlas a tu antojo, en cambio
si estn dentro de la segunda clase no es posible modificarlas por los usuarios,
ms tarde veremos formas de creacin y mantenimiento de libreras.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
3.4.- LIBRERIAS : Libreras del sistema.
De las libreras del segundo grupo anteriormente descrito estn incluidas aquellas que
son proporcionadas por el propio sistema operativo cuando este es adquirido, estas son
las libreras del sistema.
Utilizacin de funciones de las libreras del sistema.
Las funciones o rutinas que te proporciona el sistema estn descritas en las
secciones 2 y 3 del manual de referencia.
En la seccin 2 se tratan las llamadas al sistema, tienen este nombre porque te
proporcionan servicio a bajo nivel, estas llamadas del sistema estn incluidas en la
librera libc.
En la seccin 3 estn las llamadas rutinas o funciones de alto nivel y estn
incluidas en varias libreras incluso en la libc.
El formato que utiliza el manual de referencia, ( comando man ) es el siguiente:
nombre_de_funcin (nmero letra )
Nombre_de_funcin indica el nombre que debemos utilizar para invocar
esta funcin en nuestro programa.
El nmero es el nmero de la seccin del manual de referencia donde est
incluida la funcin.
La letra es la funcionalidad de la rutina.
Por ejemplo la rutina floor (3M) esta en la tercera seccin del manual y tiene
funcionalidad matemtica.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
3.5.- LIBRERIAS : Ejemplos de libreras del sistema.
Ejemplos de libreras bsicas.
Algunas de las libreras ms importantes que contiene el sistema son:
- libc Es la librera estndar de C.
Contiene:
Llamadas del sistema ( utilizables por defecto
por Fortran y Pascal adems de C ) por ejemplo fork,
exec, etc , varios includes como sys/sem.h, sys/audit.h,
stdio.h, etc.
Funciones de entrada y salida estndar, como scanf,
getchar, etc, utilizan stdio.h.
Funciones de manipulacin de caracteres, cadenas y
fechas, como strcpy, strlen, ctime,etc, utiliza los includes
stdio.h y ctype.h.
Funciones sencillas matemticas, como abs.
- libm Es la librera de funciones matemticas, algunos
ejemplos de funciones matemticas que contiene son
sin, exp, fmod,etc.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
3.6.- LIBRERIAS : Ejemplos de libreras del sistema 2.
Ms ejemplos de libreras.
- libsb Librera bsica de funciones grficas, ejemplos de
funciones pueden ser polyline3d, draw3d, etc.
- libX11 Librera de funciones X, con funciones como xterm,
xload, etc.
- libdld Librera de funciones que gestionan la carga del cdigo
ejecutable cuando se esta corriendo un programa,
algunos ejemplos de funciones pueden ser shl_get,
shl_findsym, etc.
Hay muchas otras libreras en cualquier sistema aparte de estas.
Algunas de estas libreras no estn referenciadas en el manual del sistema operativo y
tendrn su propio manual, por ejemplo rutinas propias de lenguaje Fortran y Pascal
estarn en los manuales de sus respectivos lenguajes.
Si lo que queremos es utilizar una funcin que est en el manual de referencia
deberemos tener en cuenta:
La ubicacin de la rutina dentro de las libreras para incluir la librera en el proceso
de enlace. Esto est incluido en la descripcin de la rutina en la pgina del
manual. Las libreras estn en /lib y /usr/lib.
La clausula #include que hay que insertar en tu programa, ya que es all donde se
contienen las definiciones de los datos que utiliza esta funcin. Esto aparece en la
sinopsis de la funcin en la pgina del manual. Los includes estn en /usr/include.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
3.7.- LIBRERIAS : Tipos de libreras por su construccin.
Libreras tipo archivo y tipo compartido.
El sistema operativo HP-UX permite utilizar dos tipos de libreras: tipo archivo y tipo
compartida.
Las libreras tipo archivo son las ms extendidas, mientras que de todas las
libreras anteriormente comentadas existe la versin tipo archivo, no en todos los
casos existe la versin compartida.
Cuando existen las dos versiones suelen estar en el mismo directorio.
La notacin es diferente para cada tipo, el nombre es comn, pero el sufijo es .a
para las de tipo archivo y .sl para las de tipo compartido, es decir existe la librera
libc.a y la librera libc.sl.
Ya hemos visto cual de las versiones se utiliza por el editor de enlaces, por defecto
se utilizar la de tipo compartida y esto se puede cambiar con la opcin -a del
editor de enlaces.
Como veremos ms adelante la diferencia entre los dos tipos de librera no reside
en que funciones incluyen estas libreras, sino que est en la forma de gestionar
las rutinas en el momento de la ejecucin y enlazado.
Para el mantenimiento y creacin de ellas se utilizan diferentes comandos:
- ar Libreras archivo.
- ld Libreras compartidas.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
3.8.- LIBRERIAS : Libreras tipo archivo.
Concepto.
Una librera tipo archivo contiene uno o ms ficheros objetos y es creada con el
comando ar, tiene un formato especial que incluye informacin adicional acerca
de los ficheros que componen la librera, esta informacin es estndar.
Para ver el formato de las libreras de este tipo consultar el manual de referencia
en su seccin 4 en la palabra clave ar.
Modo de funcionamiento.
Cuando el editor de enlaces encuentra una referencia externa cuya definicin
global est en una librera tipo archivo, copia el fichero objeto que contiene esta
definicin global en el fichero ejecutable.
En resumen el fichero ejecutable se construye con todo el cdigo y datos que
necesitar cuando el programa se ejecute.
El control de proceso nunca saldr del cdigo que contiene el ejecutable.
Un fichero ejecutable que no ha sido enlazado con ninguna librera compartida se
nombra como fichero completamente ejecutable.
Si tenemos varios programas ejecutables que llaman a una misma funcin el
cdigo de esta funcin estar repetido en todos los ficheros ejecutables.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
3.9.- LIBRERIAS : Libreras tipo compartido.
Concepto.
Una librera de tipo compartido contiene cdigo objeto redireccionable,
conteniendo un tipo especial de cdigo objeto llamado cdigo independiente
de la posicin, position-independent code ( PIC ).
Modo de funcionamiento.
El editor de enlaces no copia el cdigo objeto de la librera compartida al cdigo
objeto del ejecutable, como ocurre con las libreras de archivo, sino que anota que
rutinas de la librera compartida son llamadas desde la aplicacin y carga cada
una cuando dicha llamada se produce.
Cuando un programa que usa rutinas procedentes de una librera compartida
comienza a ejecutarse, el "cargador dinmico" (dld.sl) mira en el ejecutable para
saber que libreras necesita, y las asocia con el programa en tiempo de ejecucin.
Si el programa usa una librera que ya esta asociada a algn otro programa, los
programas comparten la misma copia en memoria de las rutinas de la librera.
Los ejecutables que han sido enlazados con libreras compartida se llaman
ejecutables incompletos.
Debemos tener en cuenta que si movemos la librera compartida una vez que
hemos enlazado los objetos con esa librera podemos tener problemas ya que el
cdigo no esta incluido en el ejecutable y no encontrar la librera que necesita.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
3.10.- LIBRERIAS : Ventajas libreras archivo y compartidas.
Ventajas de uso de las libreras compartidas.
- Reduce el tamao de los ejecutables.
- Menor ocupacin de memoria (solo se carga una copia de las rutinas).
- Mayor rapidez en la compilacin.
- Menor utilizacin de memoria virtual en la ejecucin.
- En aplicaciones de grficos (de Starbase por ej.), el cdigo es totalmente
independiente del hardware grfico disponible, ya que no se montan los drivers de
los dispositivos con la aplicacin.
Ventajas de uso de las libreras archivo.
- Son ms sencillas de manejar y mantener.
- Se pueden manejar su contenido de forma parcial, modificando solo parte del
cdigo incluido e ellas.
- Se controlan mejor los posibles errores al tener menos complejidad de proceso.
- Para procesos nicos son ms efectivas.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
3.11.- LIBRERIAS : PIC y cargador dinmico.
PIC.
Cdigo independiente de la posicin o position-independent code ( PIC ) es un
cdigo objeto redireccionable que no contiene direcciones virtuales absolutas.
La situacin de este cdigo no debe depender de ningn proceso particular.
Este cdigo puede ser leido y ejecutado desde varios orgenes, por varios
procesos.
La gestin de este cdigo se basa en la utilizacin de indirecciones, es decir
punteros apuntando a registros que a su vez contienen direcciones al cdigo que
se necesita.
En ejecucin se mantiene unas tablas que son esenciales para el funcionamiento
de este tipo de cdigo, son las llamadas tabla de enlace de procedimientos o
procedure linkage table ( PLT ) y tabla de enlace de datos o data linkage table
( DLT ) utilizadas para guardar que procedimientos y datos se estn utilizando en
ese momento y por quien.
Cargador dinmico.
La gestin de este cdigo la realiza las funciones contenidas en la librera dld.sl, la
cual tiene el nombre de cargador dinmico.
Son naturales las funciones shl_load para cargar una rutina de una librera
compartida en ejecucin, shl_get obtiene informacin de cuales son las rutinas
compartidas que estn cargadas en ese momento de la ejecucin, etc.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
3.12.- LIBRERIAS : Creacin de libreras archivo.
El comando ar es el utilizado para crear y mantener libreras tipo archivo. Su formato es
el siguiente:
$ ar clave [ nombre1 ] archivo [ nombre2 ]
Su misin es mantener grupos de ficheros combinados dentro de un solo fichero
fichero archivo.
El formato de los ficheros archivos contiene una cabecera estndar, cuya
descripcin esta incluida en la entrada del manual de ar en la seccin 5 de
formatos de ficheros.
Hemos comentado que se utiliza para crear y mantener libreras tipo archivo donde
los ficheros que las componen son de cdigo objeto, pero tambin podemos crear
archivos con otros ficheros como por ejemplo de tipo texto.
La tabla de smbolos del archivo es usada por el editor de enlaces para buscar de
forma eficiente las rutinas necesitadas en la librera de ficheros objeto.
Cada vez que la librera es modificada en su contenido su tabla de smbolos es
reconstruida.
El archivo incluido en el comando indica el archivo con el que vamos a trabajar, la
clave el tipo de operacin que se va a realizar, pudiendo ser varias letras y los
nombres hacen referencia a los ficheros que toman parte en la operacin adems
del archivo.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
3.13.- LIBRERIAS : Comando ar 1.
$ ar clave [ nombre1 ] archivo [ nombre2 ]
La claves que ms se utilizan se pueden dividir en dos grupos, las llamadas
maestras que indican que operacin se va a realizar y las otras solo van a
modificar esa operacin.
CLAVES MAESTRAS:
d Borra los ficheros nombre2 de archivo.
r Reemplaza los ficheros nombre2 o los aade si no
existe en el archivo.
q Aade los ficheros nombre2 estn o no en el
archivo.
t Muestra informacin de los ficheros del archivo.
p Lista los ficheros contenidos en el archivo.
m Mueve los ficheros nombre2 a la posicin
siguiente del fichero nombre1.
x Extrae los ficheros nombre2 del archivo.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
3.14.- LIBRERIAS : Comando ar 2.
$ ar clave [ nombre1 ] archivo [ nombre2 ]
Ya hemos visto que nombre1 solo se utiliza para la funcin de movimiento de
ficheros dentro del archivo.
Ahora vamos a ver algunas opciones optativas que puedes incluir despus de la
opcin maestra.
OPCIONES OPTATIVAS:
l Hace que los ficheros temporales se creen en tu
directorio de trabajo en vez de en el directorio /tmp
o /usr/tmp como se hace por defecto.
s Reconstruye la tabla de smbolos cuando
utilizamos el comando con una librera tipo
archivo, por defecto las opciones que implican una
modificacin de los ficheros componentes de la
librera lo hacen pero en otros casos no lo hacen.
u Filtra las opciones principales haciendo que solo
se modifiquen ficheros con fecha anterior a la
nueva versin que se quiere tratar.
v Informa de los ficheros que esta tratando en
ejecucin.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
3.15.- LIBRERIAS : Creacin de libreras distribuidas 1.
El primer paso para construir libreras de tipo distribuido es, como ya hemos visto generar
ficheros objeto con cdigo independiente de la posicin, el anteriormente nombrado PIC.
Generacin de cdigo PIC.
Hay dos formas de crear este tipo de cdigo, que son:
Compilar los ficheros fuentes con las opciones +z +Z.
Escribir programas de lenguaje ensamblador utilizando los modos de
direccionamiento apropiados para este tipo de cdigo.
La segunda forma no es muy realizable en general aunque en algunos casos
aislados puede ser til.
Un ejemplo de la primera forma sera:
cc -c -v +z fichero_fuente.c
En realidad ese formato se trasforma en la invocacin del comando ccom con la
opcin -c.
La diferencia de utilizar +z y +Z esta en que z tiene restringido el nmero de
smbolos que puede tratar, y Z no aunque siempre que se pueda se aconseja el
uso de +z.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
3.16.- LIBRERIAS : Creacin de libreras distribuidas 2.
Una vez que tienes el cdigo objeto de tipo PIC debes crear la librera con esos ficheros
para eso se utiliza el comando ld.
$ ld -b [ +esmbolo1 | -hsmbolo2 ] -o nombre_librera fich_objeto ...
Para crear una librera distribuida con el nombre de nombre_librera debemos
utilizar la opcin -o si omitimos esta clausula la nombrar a.out.
Es conveniente nombrar la librera con el sufijo .sl.
La opcin -b distingue el uso de simple editor de enlaces del comando ld del de
creador y mantenedor de libreras de tipo distribuido.
Los fich_objeto son los ficheros objeto con cdigo independiente de la posicin
compilados anteriormente.
Si nombre_librera no existe la crea si ya existe machaca todo su contenido, no es
posible la modificacin parcial de la librera distribuida.
OPCIONES AUXILIARES:
-hsmbolo1 Hace que ese smbolo este oculto para todas los
objetos que no contengan su definicin, es decir
no se podrn resolver las referencias externas de
ese smbolo1, pueden repetirse clausulas -h.
+esmbolo2 Hace que el smbolo pueda utilizarse por cualquier
objeto, es decir resuelve las referencias externas
del smbolo2, estas dos opciones son excluyentes.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
3.17.- LIBRERIAS : Utilizacin de libreras distribuidas 1.
Sobre protecciones.
Debes modificar las protecciones de las libreras compartidas propias si quieres
que los dems usuarios las utilicen, para ello ejecuta:
$ chmod +r+x nombre_librera
Y ubcalas en directorios propios de libreras del sistema, /lib, /usr/lib,
/usr/contrib/lib /usr/local/lib.
Interaccin con otras herramientas.
Sobre el sistema operativo HP-UX versin 9.0, el proceso de depuracin
( debugger ), no es interferido por el uso de libreras de tipo compartido.
Sin embargo no es posible la utilizacin de estas libreras para el proceso de
generacin de perfiles, se deben utilizar las libreras de tipo archivo si se necesita
generar perfiles de ejecucin.
Los comandos encargados de depurar ( xdb ) y de generar perfiles ( prof y gprof )
sern explicados en posteriores captulos.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
3.18.- LIBRERIAS : Utilizacin de libreras distribuidas 2.
Bsqueda de la librera compartida.
Cuando creamos un programa ejecutable utilizando funciones de libreras de tipo
compartido, podemos tener el siguiente problema, en ejecucin el programa va a
buscar si la funcin que necesita esta en memoria por que la haya cargado otro
proceso si no la encuentra buscar la librera de tipo compartido para extraer la
funcin indicada pero si antes de la ejecucin del proceso y despus del proceso
de enlace nosotros cambiamos de posicin esa librera el programa no la
encontrar.
Este problema se puede solucionar de dos formas:
Incluyendo en la invocacin del editor de enlaces la opcin +bdirecciones
con lo que indicaremos otros lugares de bsqueda de la librera en
ejecucin, direcciones puede incluir varios directorios separados por dos
puntos.
Por ejemplo:
$ /bin/ld /lib/crt0.o +b .:/apli/lib:: programa.o -lapl -lm -lc
Dando de alta la variable SHLIB_PATH con un conjunto de direcciones
separadas con dos puntos y en fase de enlace utilizar la opcin +s.
En este caso:
$ SHLIB_PARTH=.:/apli/lib::
$ /bin/ld /lib/crt0.o +s programa.o -lapl -lm -lc
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.1.- UTILIDAD MAKE : Servicios ofrecidos por make.
Veamos algunas posibilidades de uso que te ofrece la utilidad make.
Funciones de make.
Automatiza algunas tareas rutinarias cuando ests desarrollando software.
Documenta las relaciones entre los diferentes ficheros que forman parte de una
aplicacin de software.
Automatiza las llamadas de los preprocesadores, generadores de programas,
compiladores y herramientas afines.
Almacenar la forma en que los ficheros fuente han sido modificados y como deben
ser reprocesados.
Automatizar el comprobado, instalacin y generacin de la documentacin de los
grandes sistemas de software.
Automatizar la reconstruccin del software siguiendo la recuperacin de los
ficheros integrantes a un nuevo lugar.
Te permite usar comandos Unix como ar, sh, cc, pr y otros sin que el usuario tenga
que especificar explcitamente su llamada.
Busca un fichero de make que contiene la definicin de las reglas para estas
actividades; y si no lo encuentra aplica las reglas que tiene asignadas por defecto.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.2.- UTILIDAD MAKE : Compilacin con reglas implcitas.
Dentro del cdigo de make se contemplan unas operaciones a realizar por defecto, sobre
las funciones ya comentadas, a estas las llamamos reglas implcitas.
Make tiene como primordial funcin la de generar un fichero ejecutable desde unos
ficheros fuentes, cuando esto est claro ( solo hay un fichero fuente y no se debe utilizar
opcin alguna excepto las de defecto ), make se comportar como un compilador.
En este caso la utilizacin de make sera como compilador C pero si encontrara otro
sufijo en el programa en vez de .c utilizara otro compilador.
EJEMPLO:
$ ls
foo.c
$ make foo
cc -0 foo.c -o foo
$ ls
foo foo.c
$ ./foo
hola, mundo
$ make
Make: No arguments or description file. stop.
$ make fichero1
Make: Don't know how to make fichero1. Stop.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.3.- UTILIDAD MAKE : Construccin de software.
Ejemplo: Un pequeo programa de gestin que se podra tratar con make.
Ficheros fuente:
programa.c Cdigo fuente escrito en C.
funcin .c Cdigo fuente de una subrutina.
cabecera.h Fichero de cabecera utilizado en programa.c
con la sentencia "#include cabecera.h".
manual Fichero que contiene documentacin.
Ficheros generados:
programa.o Programa objeto generado desde programa.c
cc -c programa.c
funcin.o Programa objeto generado desde funcin.c
cc -c funcin.c
librera.a Librera de programas tiles.
ar r librera.a funcin.o
programa Ejecutable.
cc -o programa programa.o librera.a
listado Listado de la documentacin.
pr -h "Manual de usuario del programa" | lp
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.4.- UTILIDAD MAKE : Automatizando el proceso.
Make para llevar a cabo su funcin se basa en las llamadas reglas de inferencia.
Las reglas de inferencia son una estructura que va a especificar un procedimiento, son
comprensibles por el comando make.
Cada una comprende lo siguiente:
Un objetivo.
Una lista de dependencias.
Una accin.
Estn en un fichero que se llama makefile o Makefile, por defecto y contienen la
informacin que debe llevar a cabo make para conseguir el propsito.
Un ejemplo sera:
$ cat makefile
programa: programa.o librera.a
cc -o programa programa.o librera.a
programa.o: programa.c
cc -c programa.c
funcin.o: funcin.c
cc -c funcin.c
librera.a: funcin.o
ar r librera.a funcin.o
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.5.- UTILIDAD MAKE : Arbol de dependencias.
Hablamos de dependencias como un objeto o fichero del cual se depende para producir
el objetivo que queremos crear.
Esto da pi para hablar de rbol de dependencias, podemos ordenar todos los objetivos
y todas las dependencias y teniendo en cuenta que el objetivo de una regla de inferencia
puede ser una dependencia de otra regla de inferencia podremos crear el llamado rbol
de dependencias.
El camino correcto para la creacin de un makefile que realice una funcin es primero el
construir su rbol de dependencias.
Un ejemplo bsico de rbol de dependencias en el proceso de compilacin sera:
programa
programa.o librera.a
programa.c cabecera.h funcin.o
funcin.c
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.6.- UTILIDAD MAKE : Reglas de inferencia.
Hemos visto que funcin tenan las reglas de inferencia ahora veamos como se
especifican realmente en el fichero entrada de make ( por defecto makefile ).
Ejemplo:
programa: programa.o librera.a
Tab cc -o programa programa.o librera.a
Forma general:
fichero_objetivo [ fichero_objetivo ] { : } [ dependencia . . . ] [ { ; } accin ]
[ Tab accin ]
. . .
Como podemos observar se pueden incluir ms de un objetivo en la regla de inferencia
con ello queremos decir que todos ellos siguen esa misma regla de construccin,
tambin es probable que dependa de varias "dependencias" y tenga bastantes acciones
a realizar.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.7.- UTILIDAD MAKE : Macros implcitas.
Otra nocin muy utilizada en el entorno de make es la macro, su significado es la
especificacin que contiene varios elementos individuales, incluso que dependiendo del
contexto agrupa a diferentes elementos.
Hay macros implcitas y explicitas. Las macros implcitas estn proporcionadas por el
propio make y son de utilizacin frecuente, las explicitas son definidas por el usuario para
trabajo local.
Veremos un ejemplo de macro implcita;
Si tenemos un fichero makefile,
objetivo1:
hacer_algo objetivo1
objetivo2:
hacer_algo objetivo2
Tiene el mismo efecto que
objetivo1 objetivo2:
hacer_algo $*
Consideramos el smbolo $* como una macro implcita.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.8.- UTILIDAD MAKE : Reglas de inferencia sin dependencia.
Pero no toda la funcionalidad del comando make se reduce al proceso de compilacin
como estamos viendo en los ejemplos, tambin nos proporciona otras utilidades.
Generalizando los conceptos tratados anteriormente, el objetivo de una regla de
inferencia puede ser que no sea un fichero fsico sino simplemente una etiqueta que
te indique la accin a realizar en un momento determinado y las acciones no estn
ligadas al rbol de dependencia es decir no tengan que ser soportadas por l.
De esta forma podremos invocar un objetivo especfico de un fichero makefile.
Es posible que ese objetivo no tenga entradas en las dependencias con lo que solo se
ejecutaran las acciones asociadas.
Por ejemplo:
$ cat makefile
. . .
listados:
pr cabecera.h programa.c funcin.c | lp
. . .
$ make listados
request id is lj-1749 ( standard input )
$
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.9.- UTILIDAD MAKE : Macros definidas por los usuarios.
Ya hemos visto la existencia de macros en un fichero procesable por make, y sus
diversidad, macros implcitas y explcitas.
Las macros explcitas estn definidas por el usuario y su uso es semejante a las variables
de shell.
Las asignaciones de macros se suelen definir antes de la lista de las reglas de inferencia
y despus hacer mencin a ella utilizando parntesis y el smbolo dolar $ precedindolo.
Es posible insertar asignaciones a macros explicitas en la parte donde estn las acciones
con lo que esto afectar a la definicin a lo largo del rbol de dependencia de ese
objetivo, si es que lo tiene.
Por ejemplo:
$ cat makefile
. . .
FNTS = cabecera.h programa.c funcin.c
. . .
listados:
pr $(FNTS) | lp
. . .
$ make listados
request id is lj-1749 ( standard input )
$
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.10.- UTILIDAD MAKE : Comentarios en un makefile.
Se pueden insertar comentarios en un fichero de make para que este sea ms legible y
se pueda mantener con mayor facilidad.
Para ello se habilita el carcter # al principio de lnea.
Se pueden insertar en cualquier punto del fichero makefile.
Veamos un ejemplo:
$ cat makefile
. . .
# Observe que se obtienen dos listados utilizando
# este makefile :
# un manual de usuario y el listado del cdigo fuente.
listados:
pr $(FNTS) | lp
# los nombres de ficheros estn en la variable FNTS.
. . .
$
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.11.- UTILIDAD MAKE : Suprimir ecos de ejecucin.
Otra opcin posible a la hora de ejecutar un procedimiento make es la de suprimir los
ecos que aparecen por defecto en dicha ejecucin.
El comando make reconoce la opcin -s para llevar a cabo esta funcin, tambin puede
llevarse a cabo incluyendo antes de la accin una arroba @.
En esta sucesin de ordenes comprobamos un ejemplo de esta funcionalidad.
$ cat makefile
. . .
objetivo: dependencia
echo ' hola esto es una prueba '
. . .
$ make objetivo
echo ' hola esto es una prueba '
hola esto es una prueba
$ make -s objetivo
hola esto es una prueba
$ vi makefile ( se hacen los cambios )
$ cat makefile
. . .
objetivo: dependencia
@ echo 'hola esto es una prueba'
. . .
$ make objetivo
hola esto es una prueba
$
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.12.- UTILIDAD MAKE : Comprobar un makefile.
Otra opcin til para probar un fichero fuente de make es leer las ordenes contenidas en
el fichero chequendolas pero sin ejecutarlas.
Esto es realizable por la opcin -n de make, con lo que por defecto nos informar
visualmente de los pasos que realizara.
Por ejemplo:
$ ls
makefile fichero_prueba
$ cat makefile
. . .
objetivo: dependencia
rm fichero_prueba
. . .
$ make -n objetivo
rm fichero_prueba
$ ls
makefile fichero_prueba
$ make objetivo
$ ls
makefile
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.13.- UTILIDAD MAKE : Acciones de Make.
Las acciones se ponen siempre detrs de su regla de inferencia en el makefile.
Esta precedida por un tabulador
Puede haber ms de una en cada regla de inferencia.
Son comandos de shell, por defecto reconoce los comandos de la shell de Bourne, pero
se puede indicar otra shell inicializando la variable de entorno SHELL con la direccin de
la shell que deseas utilizar.
Un ejemplo de esto sera:
$ cat makefile
. . .
SHELL=/bin/ksh
prog: ../proglib fuente_1.o fuente_2.o
Tab cc -O fuente_1.o fuente_2.o ../proglib
Tab mv a.out prog
. . .
$
Y no existira ningn problema sin embargo si utilizramos comandos de la csh nos
informara de un error de comando no encontrado.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.14.- UTILIDAD MAKE : Make como comando.
El formato general de utilizacin del comando make es:
make [ opciones ] [ MACRO = cuerpo ] [ objetivo . . . ]
Especificando un objetivo explcitamente, por ejemplo,
$ make listados
Ignora los objetivos que no estn por debajo en el rbol de dependencia, al no
necesitarlos para conseguir el objetivo seleccionado no se efectan.
Si no incluimos objetivo en la invocacin del comando se ejecuta el objetivo que
est en la cima del rbol de dependencias.
Una macro explcita puede ser definida en la lnea de comandos, por ejemplo,
$ make CFLAGS = -O objetivo
No olvidemos que se estarn ejecutando siempre las instrucciones que estn
incluidas en los ficheros makefile o Makefile.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.15.- UTILIDAD MAKE : Usando un fichero no llamado
"makefile".
Otra opcin interesante que nos permite tener varios ficheros con especificaciones para
make en el mismo directorio es -f seguida del nombre de fichero donde se encuentren
dichas especificaciones.
En resumen esta opcin se utiliza para leer las reglas de inferencia desde otro fichero
que no se llame makefile ni Makefile.
Por ejemplo:
$ make -f otro_fichero_diferente
Tambin se podra indicar con otro formato para leer las reglas de inferencia de la
entrada estndar de datos.
Para ello utilizaremos el guin - como indicativo de fichero.
Por ejemplo:
$ make -f - objetivo
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.16.- UTILIDAD MAKE : Para ignorar errores de comandos.
Otra opcin de make hace que sean ignorados los errores producidos en la ejecucin de
un comando incluido dentro de las acciones de un fichero fuente de make.
Con esta opcin no cancelar el proceso de make y seguir ejecutando las dems
acciones que se indiquen.
La opcin a la que nos referimos es -i.
Por ejemplo:
$ cat Makefile $ make -i paco
. . . primer mensaje
paco: cat fichero_inexistente
@ echo primer mensaje cat: cannot open fichero_inexistente
cat fichero_inexistente * * * error code 2 ( ignored )
@ echo segundo mensaje segundo mensaje
. . .
En cambio si no utilizamos -i o utilizando la redireccin de los errores.
$ make paco $ make -i paco 2 > errorlog
primer mensaje primer mensaje
cat fichero_inexistente cat fichero_inexistente
cat: cannot open fichero_inexistente * * * error code 2 ( ignored )
* * * error code 2 segundo mensaje
Stop.
$ cat errorlog
cat: cannot open fichero_inexistente
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.17.- UTILIDAD MAKE : Comprobar un makefile 2.
Incluimos un ejemplo de utilizacin y desarrollo de un fichero fuente de make para su
correcta habilitacin:
$ cat makefile
. . .
install: programa
@ rm /bin/programa ; mv programa /bin
@ chmod 555 /bin/programa
@ chown bin /bin/programa ; chgrp bin /bin/programa
@ echo se ha instalado programa en /bin
. . .
$ ll /bin/programa
-r-xr-xr-x 1 bin bin 14101Feb 17 1989 /bin/programa
$ make -n install
cc -o programa programa.c
rm /bin/programa ; mv programa /bin
chmod 555 /bin/programa
chown bin /bin/programa ; chgrp bin /bin/programa
echo se ha instalado programa en /bin
$ ll /bin/programa
-r-xr-xr-x 1 bin bin 14101Feb 17 1989 /bin/programa
$ make install
cc -o programa programa.c
se ha instalado programa en /bin
$ ll /bin/programa
-r-xr-xr-x 1 bin bin 14563Dec 17 1994 /bin/programa
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.18.- UTILIDAD MAKE : Comando touch.
La primordial funcionalidad del comando make como ya comentamos esta en
automatizar el proceso de compilacin de un programa o grupo de programas,
pues para conseguir esta funcionalidad es muy til el uso del comando touch.
Make por defecto comprueba que los ficheros que actualiza sean de una versin antigua
con lo que si no lo son te informa de ello y no ejecuta la modificacin del fichero.
Touch actualiza la fecha y hora de la creacin o ltima actualizacin de un fichero y en
el contexto make se utiliza para que actualice el fichero que se desea modificar.
Se puede incluir la opcin de make -t para hacer un touch de los ficheros objetivos, con
lo que no permitiramos modificarlos con make despus, a no ser que modificramos
algunos de los ficheros de los que dependen.
Por ejemplo:
$ cat makefile
programa: programa.c
cc -O -o programa programa.c
$ make programa
cc -O -o programa programa.c
$ make programa
'programa' is up to date.
$ touch programa.c
$ make programa
cc -O -o programa programa.c
$ touch programa.c
$ make -t programa
touch ( programa )
$ make programa
'programa' is up to date.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.19.- UTILIDAD MAKE : Acceso a variables del entorno.
Cuando se ejecuta un procedimiento make, es posible acceder a las variables de la shell
del entorno, recordando, para cambiar una variable local al entorno ejecutbamos el
comando export con el nombre de las variables.
Tambin vimos que se podan redefinir estas variables dentro del fichero fuente de make.
El comando make nos proporciona una opcin para hacer que sean las definiciones del
entorno las validas en ejecucin despreciando las redefiniciones del fichero fuente.
Esta opcin es -e, y aqu presentamos un ejemplo de utilizacin:
$ cat makefile
programa: programa.c
cc $(CFLAGS) -o programa programa.c
$ make programa
cc -O -o programa programa.c
$ export CFLAGS=-g
$ touch programa.c
$ make programa
cc -g -o programa programa.c
$ vi makefile ( se modifica makefile )
$ cat makefile
CFLAGS=-p
programa: programa.c
cc $(FLAG) -o programa programa.c
$ touch programa.c
$ make -e programa
cc -g -o programa programa.c
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.20.- UTILIDAD MAKE : Pasar parmetros a comandos.
Cuando se invoca a make se pueden incluir parmetros con sus correspondientes
asignaciones para utilizar dentro del fichero fuente.
Estos parmetros se incluirn dentro de la zona de opciones del comando make y se
especificar directamente el parmetro y su valor con el signo = en medio.
Este sera un ejemplo muy apropiado:
$ cat programa_prueba.c
. . .
# ifdef DEBUG
printf ( " Variable interna x = %d\n ", x );
# endif
. . .
$ cat makefile
. . .
CFLAGS = -O $D
. . .
$ make programa_prueba
cc -O -o programa_prueba programa_prueba.c
$ ./programa_prueba ( el programa corre normalmente )
$ rm programa_prueba
$ make D=-DDEBUG programa_prueba
cc -O -DDEBUG programa_prueba programa_prueba.c
$ ./programa_prueba
Variable interna x = 123
$
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.21.- UTILIDAD MAKE : Utilizar la jerarqua de los directorios
de ficheros fuente.
Notemos que dentro de un fichero fuente de make podemos cambiar de directorio como
hacemos en lnea.
Esto nos proporciona la posibilidad de tener una aplicacin distribuida por directorios y
no ser un problema para integrar toda la gestin en un solo fichero fuente.
Tambin se puede invocar al comando make desde el mismo comando make
especificndolo en el fichero fuente del primero.
Vemos este ejemplo:
$ pwd
/users/paco/proyecto
$ ls -CFR
prog* proglib proglib.src/ src/
proglib.src:
makefile func1.c func2.c
src:
makefile func3.c func4.c func5.c
$ cat src/makefile
. . .
prog: ../proglib func1.o func2.o
cc $(CFLAGS) func1.o func2.o ../proglib
mv a.out ../prog
../proglib:
cd ../proglib.src ; make
. . .
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.22.- UTILIDAD MAKE : Diferencia entre shell scrips y
acciones de un makefile.
Las secuencias de comandos de shell no se ejecutan de igual forma si estn incluidas en
un shellscript que en un makefile.
Cada accin de un makefile se ejecuta como un proceso de shell diferente sin relacin
con los otros.
Este proceso generado por la accin cuelga directamente del proceso make de forma
que es difcil la conexin entre comandos de diferentes acciones.
Si queremos que dos comandos se basen uno en el otro los deberemos incluir en la
misma accin.
Sera incorrecto:
$ ls -CFR
makefile src/
src:
programa.c
$ cat makefile
programa: src/programa.c
cd src
cc -o programa programa.c
$ make programa
cd src
cc: programa.c non-existent
*** Error code 2
Stop.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.23.- UTILIDAD MAKE : Programas de shell en makefiles 1.
La ejecucin de un shellscript ser diferente si se invoca directamente;
$ nombre_script
Teniendo una ejecucin de las ordenes similar al fichero make o
$ . nombre_script
Ejecutndose los comandos como si estuvieran incluidos en la misma accin dentro del
fichero fuente de make.
La versin buena del ejemplo de la anterior transparencia sera:
$ ls -CFR
makefile src/
src:
programa.c
$ cat makefile
programa: src/programa.c
cd src ; cc -o programa programa.c
$ make programa
cd src ; cc -o programa programa.c
$ src/programa
hola , mundo.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.24.- UTILIDAD MAKE : Programas de shell en makefiles 2.
Una versin ms elaborada del ejemplo anterior conteniendo la creacin de un fichero
script sera:
$ ls -CFR
makefile src/
src:
programa.c
$ cat makefile
programa: src/programa.c
echo cd src > script
echo cc -o programa programa.c >> script
chmod +x script
script
rm script
$ make programa
echo cd src > script
echo cc -o programa programa.c >> script
chmod +x script
script
rm script
$ src/programa
Hola mundo.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.25.- UTILIDAD MAKE : Programas de shell en makefiles 3.
Otra forma para conectar ejecucin de comandos por medio de make y shellscript o
incluso para ejecucin de shell interactiva sera la que refleja el ejemplo.
$ ls -CFR
makefile src/
src:
programa.c
$ cat makefile
programa: src/programa.c
cd src
cc -o programa programa.c
$ make -n programa | ksh
$ src/programa
Hola mundo.
$ rm src/programa
$ make -n programa | tee /dev/tty | ksh
cd src
cc -o programa programa.c
$ src/programa
Hola mundo.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.26.- UTILIDAD MAKE : Usar variables de la shell en
makefiles.
El uso de las variable de shell es diferente al de las macros de usuario.
Por variables de shell nos referimos a las que se dan de alta en las acciones.
Ya hemos visto como se utilizan las macros explcitas, pues las variables de la shell
deben accederse con un truco, debemos poner una asignacin al carcter $ y utilizar ese
segundo carcter en la accin esto es as porque hay confusin entre el signo $ de
invocacin de una macro y de el mismo signo utilizado para la sustitucin de variables de
shell.
Un ejemplo que puede aclarar:
$ cat makefile
etiqueta:
@ variable="contenido de la variable" ; echo $variable
$make etiqueta
ariable
$ vi makefile ( se edita el fichero )
$ cat makefile
$$=$
etiqueta:
@ variable="contenido de la variable" ; echo $$variable
$ make etiqueta
contenido de la variable
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.27.- UTILIDAD MAKE : Dependencias especiales.
Hay unos objetivos que son especiales en su gestin, se denominan con unos caracteres
preestablecidos y se invocarn o sern requeridos siempre que se den unas
circunstancias especiales.
Objetivos ya preestablecidos son los siguientes:
Nombre del Objetivo Propsito
.PRECIOUS: Impide borrar los ficheros que se nombran
como dependencias si make es
interrumpido.
.SILENT: Hace omitir los ecos de las acciones que se
ejecutan.
.IGNORE: Hace que no cese la ejecucin de los
comandos si uno falla.
.DEFAULT: Ejecuta la siguiente accin si el objetivo no
es encontrado y no hay ninguna regla de
inferencia implcita que se satisfaga.
.SUFFIXES: Define reglas de inferencia implcitas.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.28.- UTILIDAD MAKE : Reglas y macros por defecto 1.
La definicin de una regla implcita que cree un fichero .o a partir de uno de la forma .c
sera:
.c.o:
cc -c $<
Estamos utilizando una macro que no hemos definido nosotros y basndonos en un
objetivo con un significado especial que tiene el comando make por defecto.
$< es una macro que esta definida por defecto y contiene el nombre del fichero
que provoca tal accin.
Ahora make aplica la accin asociada a la regla implcita todas las veces que es
encontrada una regla explcita sin acciones asociadas, como por ejemplo:
fichero.o : fichero.c
Se pueden aadir dependencias a esta regla explcita, por ejemplo:
objetivo.o : objetivo.c objetivo.h globals.h
La macro $< se explica en la siguiente transparencia.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.29.- UTILIDAD MAKE : Reglas y macros por defecto 2.
Una lista de macros por defecto sera:
Macro Se expande a . . .
$< El nombre del fichero que es causante de la
accin.
$@ El nombre del fichero que se va a crear.
$? Los nombres de ficheros que sean ms recientes
que el fichero objetivo.
$* El prefijo compartido por los nombres de los
ficheros de la dependencia y el objetivo.
$% Los miembros componentes de un archivo que
forme parte de de una dependencia especial de
librera.
Usadas para lo siguiente:
Definiendo reglas de inferencia implcitas.
Definiendo acciones.
Ejemplo:
programa: programa.c
cc -o $@ $?
Sera lo mismo que:
programa: programa.c
cc -o programa programa.c
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.30.- UTILIDAD MAKE : Reglas y macros por defecto 3.
Se muestra un ejemplo de utilizacin de macros implcitas y como asume el comando
unas reglas de inferencia por defecto.
Se da el caso de que estas reglas de inferencia estn redefinidas para la posible
utilizacin general.
El contenido del fichero fuente de make sera:
# CFLAGS esta en principio vaco
# se redefinira a -O para optimizar.
# CC contendr el nombre del compilador de C.
CFLAGS =
CC = cc
.c .o :
$(CC) $(CFLAGS) -c $*.c
.a .o :
ar r $@ $?
programa: programa.o librera.a
cc -o programa programa.o librera.a
programa.o: programa.c cabecera.h
funcin.o: funcin.c cabecera.h
librera.a: funcin.o
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.31.- UTILIDAD MAKE : Reglas y macros por defecto 4.
Hay una opcin del comando make que nos ayuda a reconocer cuales son las macros y
reglas de inferencia por defecto.
La opcin es -p, es conveniente redireccionar la salida de errores y la estndar a ficheros
para poder ver el resultado.
Una parte del listado sera:
$ make -p 2 > /dev/null
DISPLAY = local:0.0
PATH = .:/users/david/bin:/usr/bin/X11:/bin: . .
LOGNAME = david
EDITOR = /usr/bin /vi
SHELL = /bin/ksh
CFLAGS = -O
CC = cc
LDFLAGS =
LD = ld
LFLAGS =
MAKE = make
MAKEFLAGS = b
.c .o:
$(CC) $(CFLAGS) -c $<
.SUFFIXES: .o .c .y .l .h . . .
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
4.32.- UTILIDAD MAKE : Corriendo make sin un makefile.
La existencia del comando make tiene como principal finalidad ayudarnos en la tarea de
desarrollo de aplicaciones en cualquier lenguaje, se deduce de esto que la mayora de
las reglas y macros por defecto estn orientadas a este propsito.
Uniendo tambin que estas reglas por defecto se pueden aplicar con eficacia en
ausencia de un fichero makefile hace que sea factible el uso del comando make sin
basarnos en un fichero fuente de make.
En muchas de las reglas de inferencia implcitas el objetivo consta de un sufijo simple,
por ejemplo:
.c:
$(CC) $(CFLAGS) $< $(LDFLAGS) -o $@
Indican como construir los ficheros ejecutables desde sus correspondientes ficheros
fuente en C.
Se completa la accin de la regla implcita con las macros definidas por defecto CC,
CFLAGS y LDFLAGS que tu podrs redefinir en la invocacin del comando make,
adems estn las macros que proporciona el sistema.
El resultado de teclear:
$ make programa
En un directorio sin makefile ser el de compilar programa.c y generar programa con las
opciones por defecto.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
5.1.- PERFILES : Introduccin a perfiles de ejecucin.
Introduccin
Se trata de analizar la ejecucin de un programa para poder sacar conclusiones
sobre el funcionamiento de tal programa.
Es muy interesante este aspecto ya que en muchos programas es importante la
optimizacin del cdigo en cuanto a tiempos de ejecucin, y con estos
generadores de perfiles podemos saber cuales de las rutinas gastan ms tiempo e
incluso de donde proviene el control que hace que gasten mucho tiempo de CPU.
Se comentar el funcionamiento de dos comandos de generacin de perfiles de
ejecucin como son prof y gprof.
Estas herramientas no son depuradores de cdigo ni mejoradores de este, lo nico
que proporcionan es informacin sobre determinadas ejecuciones de los
programas que queremos analizar.
Gprof es una versin mejorada de prof incluso la informacin que se refleja en prof
aparece tambin en gprof.
Prof es una herramienta exclusiva de C, y en cambio gprof tiene utilidad cuando se
esta desarrollando con otros lenguajes como Fortran y Pascal.
Gprof ha sido desarrollado por la Universidad de Berkeley, esto le confiere cierto
grado de estandarizacin, prof cumple la norma de portabilidad XPG2 y proviene
de la familia de los Unix System V.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
5.2.- PERFILES : Comando prof. Fases.
Fases de la generacin de perfiles
Para utilizar el comando prof se debe compilar todos los mdulos que contengan
el programa con la opcin -p del compilador.
$ cc -c -p *.c
Enlazar todos los mdulos objeto con la opcin -p del editor de enlaces.
$ cc -p -o programa.exe *.o
Ejecutar el programa.
$ programa.exe < entrada.dat > salida.dat
Ejecutar la utilidad de perfiles en este caso el comando prof.
$ prof programa.exe > estadis_fich
Analizar las estadsticas del perfil generado.
$ more estadis_fich
Si la ejecucin del programa depende de los datos de entrada que le suministres,
ejecuta el programa con todos los datos de entrada que poseas para un mejor
anlisis del funcionamiento.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
5.3.- PERFILES : Comando prof. Funcionamiento.
Funcionamiento del comando
Se debe incluir la opcin -p durante las fases de compilacin y enlace, esto hace
que:
La utilidad ccom ( que lanza el compilador y genera el cdigo en
ensamblador ) se invoque con las opciones Yp.
El ensamblador as ( para traducir cdigo ensamblador a cdigo mquina )
se invoque con la opcin -l.
La invocacin del editor de enlaces se ve modificada en que se suprime la
opcin por defecto -x con lo que estbamos optimizando el funcionamiento
del ejecutable y aadiendo el directorio de bsqueda de libreras /lib/libp
para que utilice estas como defecto.
Con el uso de todas estas opciones se genera un ejecutable sustancialmente
diferente al que normalmente tenemos, ya que se insertan llamadas a la rutina
monitor() al principio y al final del ejecutable. De tal forma que cuando ejecutamos
el programa ya compilado en la llamada de la rutina monitor() al final de la
ejecucin se crea un fichero de perfiles.
El fichero generado se llama mon.out y se genera por defecto en el directorio de
trabajo, si esto se desea cambiar se debe dar de alta la variable de shell PROFDIR
con la direccin deseada.
Una vez que tengamos generado el fichero de perfiles solo debemos invocar el
comando prof con el fichero ejecutable y el fichero de perfiles tal y como se
muestra en la siguiente trasparencia.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
5.4.- PERFILES : Comando prof. Estructura 1.
Formato del comando prof
$ prof [ -tcan ] [ -ox ] [ -g ] [ -z ] [ -h ] [ -s ] [ -m fich_prof ]
[ prog ]
Como ya hemos apuntado lo que hace el comando prof es interpretar un fichero de
perfiles generados por la rutina monitor().
Lee la tabla de smbolos en el fichero ejecutable que hemos compilado con
anterioridad y a la vez este fichero de perfiles.
Para cada funcin ejecutada se visualiza los siguientes datos :
El porcentaje de tiempo gastado en la ejecucin de esa funcin del total de
la ejecucin.
El nmero de veces que la funcin ha sido llamada.
La media de milisegundos gastados por cada llamada.
Puede ser que la ejecucin de un mismo fichero de datos diferentes esto puede
ser posible por el nmero de xitos conseguidos en el acceso de datos en
memoria cach y la ocupacin de la memoria por otros procesos.
El nmero mximo de llamadas a funciones que puede procesar la opcin -p en la
invocacin al compilador es de 600 si se supera este nmero se genera un fichero
de perfil errneo con lo que se deber utilizar la rutina monitor() directamente.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
5.5.- PERFILES : Comando prof. Estructura 2.
$ prof [ -tcan ] [ -ox ] [ -g ] [ -z ] [ -h ] [ -s ] [ -m fich_prof ]
[ prog ]
Indicamos el nombre del ejecutable que queremos investigar con el nombre prog.
OPCIONES
Las opciones t, c, a, n son excluyentes y determinan el tipo de ordenacin de
las lneas de salida.
-t Ordena decrecientemente por el porcentaje de
tiempo gastado en la ejecucin con respecto al
total.
-c Ordena decrecientemente por el nmero de
llamadas a esta funcin.
-a Ordena decrecientemente por la direccin de la
funcin.
-n Ordena por el nombre de las funciones en orden
creciente.
Tambin son excluyentes las opciones o, x entre si.
-o Visualiza la direccin de la funcin en octal.
-x Igual a la anterior en hexagesimal.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
5.6.- PERFILES : Comando prof. Estructura 3.
$ prof [ -tcan ] [ -ox ] [ -g ] [ -z ] [ -h ] [ -s ] [ -m fich_prof ]
[ prog ]
OPCIONES:
-g Incluye las estadsticas de las funciones estticas.
-z Incluye todas las funciones que por defecto se
incluyen en el fichero de perfiles aunque no
tengan informacin relevante.
-h Suprime la cabecera que por defecto aparece
indicando el significado de los valores, esta opcin
es muy til si se quiere seguir procesando el
fichero resultante con el informe.
-s Muestra por el canal de error estndar un resumen
de las estadsticas de utilizacin de las funciones
que por defecto incluye monitor().
-m fich_prof Se utiliza el fichero de perfiles fich_prof en vez de
mon.out por defecto, con ello podemos guardar
varios ficheros de perfiles y tratarlos cuando
queramos.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
5.7.- PERFILES : Comando prof. Ejemplo.
Ejemplo de la salida del comando prof
%Time Seconds Cumsecs #Calls msec/call Name
66.7 0.12 0.12 2247 0.053 __doprnt
22.2 0.04 0.16 499 0.08 __fcvt
11.1 0.02 0.18 2247 0.009 __printf
0.0 0.00 0.18 1 0. __profil
0.0 0.00 0.18 499 0.00 __rand
0.0 0.00 0.18 1 0. ____exit
0.0 0.00 0.18 1 0. __atexit
0.0 0.00 0.18 1998 0.000 __abs
0.0 0.00 0.18 1 0. __start
0.0 0.00 0.18 999 0.00 _cursor
0.0 0.00 0.18 1 0. _main
0.0 0.00 0.18 135 0.00 __fwrite
0.0 0.00 0.18 2247 0.000 __wrtchk
0.0 0.00 0.18 1 0. ___findbuf
0.0 0.00 0.18 1 0. __isatty
0.0 0.00 0.18 1 0. __ioctl
0.0 0.00 0.18 8909 0.000 __memcpy
0.0 0.00 0.18 2 0. __xflsbuf
0.0 0.00 0.18 135 0.00 __bufsync
0.0 0.00 0.18 2 0. __write
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
5.8.- PERFILES : Comando gprof. Fases.
Fases de la generacin de perfiles grficos.
Para utilizar el comando gprof se debe compilar todos los mdulos que contengan
el programa con la opcin -G del compilador.
$ cc -c -G *.c
Enlazar todos los mdulos objeto con la opcin -G del editor de enlaces.
$ cc -G -o programa.exe *.o
Ejecutar el programa.
$ programa.exe < entrada.dat > salida.dat
Ejecutar la utilidad de perfiles en este caso el comando gprof.
$ gprof programa.exe > sal_graf_fich
Analizar las estadsticas grficas del perfil generado.
$ more sal_graf_fich
Si la ejecucin del programa depende de los datos de entrada que le suministres,
ejecuta el programa con todos los datos de entrada que poseas para un mejor
anlisis del funcionamiento.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
5.9.- PERFILES : Comando gprof. Funcionamiento.
Funcionamiento del comando
Se debe incluir la opcin -G durante las fases de compilacin y enlace, esto hace
que:
La utilidad ccom ( que lanza el compilador y genera el cdigo en
ensamblador ) se invoque con las opciones Yp.
El ensamblador as ( para traducir cdigo ensamblador a cdigo mquina )
se invoque con la opcin -l.
La invocacin del editor de enlaces se ve modificada en que se suprime la
opcin por defecto -x con lo que estbamos optimizando el funcionamiento
del ejecutable y aadiendo el directorio de bsqueda de libreras /lib/libp
para que utilice estas como defecto adems de utilizar el fichero /lib/gcrt0.o
en vez del /lib/crt0.o.
A diferencia del comando prof que es exclusivo para el lenguaje C, gprof puede
tratar otros lenguajes como Pascal y Fortran.
De igual manera que con el comando prof, el ejecutable que generamos el
diferente al que obtenemos normalmente, este ejecutable tiene ms posibilidades
que el generado por prof, integra otras llamadas a funciones adems de la que
mencionamos con el comando prof, la rutina monitor().
El fichero generado se llama mon.out y se genera por defecto en el directorio de
trabajo.
Una vez que tengamos generado el fichero de perfiles solo debemos invocar el
comando gprof con el fichero ejecutable y el fichero de perfiles tal y como se
muestra en la siguiente trasparencia, si incluimos ms de un fichero de perfiles
entonces los datos obtenidos sern suma de los perfiles que tengamos.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
5.10.- PERFILES : Comando gprof. Estructura 1.
$ gprof [ -a ] [ -b ] [ -s ] [ -z ] [ -e rutina1 ] [ -E rutina2 ] [ -f rutina3 ]
[ -F rutina4 ] [ prog ] [ fich_perf ... ]
Prog ser el fichero ejecutable compilado con la opcin -G, por defecto se toma el
fichero a.out si existe en el directorio de trabajo.
Fich_perf ser el fichero de perfiles que se gener con la ejecucin del ejecutable
anterior, se pueden incluir ms de un fichero de perfiles con lo que los informes
que genera el comando gprof son un resumen de las dos ejecuciones, por defecto
se toma el fichero de perfiles gmon.out si existe.
OPCIONES:
-a Suprime las referencias en el informe de las
funciones estticas.
-b Suprime la informacin de cabecera, donde se
explica lo que significa cada campo en el grfico
del perfil.
-s Produce un fichero con el nombre de gmon.sum
donde se incluye los perfiles que se mencionen
aportndolos si ya existe, luego se puede utilizar
este nuevo fichero de perfiles.
-z Visualiza en el grfico las rutinas sin utilizacin.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
5.11.- PERFILES : Comando gprof. Estructura 2.
$ gprof [ -a ] [ -b ] [ -s ] [ -z ] [ -e rutina1 ] [ -E rutina2 ] [ -f rutina3 ]
[ -F rutina4 ] [ prog ] [ fich_perf ... ]
OPCIONES:
-e rutina1 Suprime del grfico la entrada de la rutina de
nombre rutina1 y todos sus descendientes pero
teniendo en cuenta las cantidades aportadas por
ella de las dems funciones. Se pueden incluir en
estas opciones ms de una del mismo tipo con
rutinas diferentes, pero solo indicar una rutina en
cada opcin.
-E rutina2 Suprime del grfico la entrada de la rutina de
nombre rutina2 y todos sus descendientes y
suprimiendo tambin las cantidades aportadas por
ella de las dems funciones.
-f rutina3 Solo representa el grfico de la rutina3 y sus
descendientes.
-F rutina4 Solo representa el grfico de la rutina4 y sus
descendientes, y solo contando con estas
funciones cuando se calculan los totales.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
5.12.- PERFILES : Comando gprof. Informes de salida.
En el informe del perfil de ejecucin se producen dos partes:
Lista de totales
Esta lista es la resultante del comando prof, muestra las cantidades de tiempo de
ejecuciones totales y contadores de nmero de llamadas de cada funcin en el
programa, ordenadas por tiempo decreciente.
Grfico de ejecucin
Aparecen las funciones ordenadas por el momento de entrada a ejecutarse en el
flujo de programa, indicando funcin padre y llamadas a otras funciones desde all.
Con esto obtenemos todo el rbol del control de flujo que tiene nuestro programa
incluidas las llamadas a rutinas de libreras y sus respectivas invocaciones a otras
funciones.
La informacin de cada funcin va desglosada segn desde donde provenga el
control del programa, por ejemplo se incluyen cifras de tiempo de ejecucin de la
rutina que ha sido llamada por esa va.
Tambin se incluye datos comparativos entre llamadas a rutinas descendientes de
una dada para visualizar si una rutina tiene mayor peso en ejecucin que otra.
Acumula tiempos de ejecucin de una rutina y sus descendientes.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
5.13.- PERFILES : Comando gprof. Ejemplo 1.
Ejemplo de grficos de ejecucin
called/total parents
index %time self descendents called+self name index
called/total children
----------------------------------------------------------------------------------------------------------------------
<spontaneous>
[1] 98.8 0.00 1.68 _main [1]
0.00 0.92 1248/2247 __printf [3]
0.00 0.76 999/999 _cursor [5]
0.00 0.00 499/499 __rand [18]
----------------------------------------------------------------------------------------------------------------------
0.14 1.52 2247/2247 __printf [3]
[2] 97.6 0.14 1.52 2247 __doprnt [2]
1.36 0.00 2247/2382 __memchr [4]
0.00 0.12 135/135 _dowrite [7]
0.00 0.02 499/499 __fcvt [12]
0.02 0.00 8773/8909 __memcpy [10]
----------------------------------------------------------------------------------------------------------------------
0.00 0.74 999/2247 _cursor [5]
0.00 0.92 1248/2247 _main [1]
[3] 97.6 0.00 1.66 2247 __printf [3]
0.14 1.52 2247/2247 __doprnt [2]
0.00 0.00 2247/2247 __wrtchk [17]
----------------------------------------------------------------------------------------------------------------------
0.08 0.00 135/2382 __fwrite [6]
1.36 0.00 2247/2382 __doprnt [2]
[4] 84.7 1.44 0.00 2382 __memchr [4]
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
5.14.- PERFILES : Comando gprof. Ejemplo 2.
Siguiendo con el ejemplo:
0.00 0.76 999/999 _main [1]
[5] 44.6 0.00 0.76 999 _cursor [5]
0.00 0.74 999/2247 __printf [3]
0.02 0.00 1998/1998 __abs [11]
----------------------------------------------------------------------------------------------------------------------
0.00 0.12 135/135 _dowrite [7]
[6] 7.2 0.00 0.12 135 __fwrite [6]
0.08 0.00 135/2382 __memchr [4]
0.00 0.04 2/2 __xflsbuf [9]
0.00 0.00 136/8909 __memcpy [10]
----------------------------------------------------------------------------------------------------------------------
0.00 0.12 135/135 __doprnt [2]
[7] 7.2 0.00 0.12 135 _dowrite [7]
0.00 0.12 135/135 __fwrite [6]
0.00 0.00 135/135 __bufsync [19]
----------------------------------------------------------------------------------------------------------------------
0.00 0.00 136/8909 __fwrite [6]
0.02 0.00 8773/8909 __doprnt [2]
[10] 1.2 0.02 0.00 8909 __memcpy [10]
----------------------------------------------------------------------------------------------------------------------
0.00 0.00 499/499 _main [1]
[18] 0.0 0.00 0.00 499 __rand [18]
----------------------------------------------------------------------------------------------------------------------
0.00 0.00 135/135 _dowrite [7]
[19] 0.0 0.00 0.00 135 __bufsync [19]
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.1.- DEBUGGER : Introduccin al depurador.
Concepto
Un depurador o trazador de programa nos ayuda en nuestro propsito de construir
un programa correctamente, lo podemos utilizar en el momento en que nuestro
programa este bien construido sintcticamente pero no desarrolle el trabajo para el
cual lo hemos desarrollado.
Funcionalidad:
Nos proporciona las siguientes funcionalidades:
Podemos ver el cdigo de nuestro programa.
Podemos ver en tiempo de ejecucin variables y modificar sus valores.
Podemos apreciar por que lneas de cdigo transcurre el programa ( lo que
llamamos program flow ).
Podemos grabar una sesin de depurador y volverla a invocar ms tarde.
Podemos ejecutar ordenes propias del depurador despus de la ejecucin
de cada orden del programa.
Podemos ver el cdigo mquina que se esta ejecutando de nuestro
programa.
Podemos examinar los ficheros core ( ficheros generados por errores en
programas ).
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.2.- DEBUGGER : Tipos de depuradores y el xdb.
Tipos de depuradores:
En este campo no podemos hablar de una estandarizacin, si nos basamos ya
en que incluso en el campo de los lenguajes de programacin hay problemas
de portabilidad ( por ejemplo los tipos de datos se tratan de distinta forma con un
mismo lenguaje en diferentes ordenadores ) es muy difcil que sigan una mismas
normas a nivel interno.
Si es cierto que todos ellos suelen compartir las mismas funcionalidades y que la
interface con el usuario suele ser similar.
Generalmente los depuradores estn orientados para corregir cdigo de un solo
lenguaje en el caso de Hewlett Packard existen estos:
cdb depurador para lenguaje C.
pdb depurador para lenguaje Pascal.
fdb depurador para lenguaje Fortran.
El depurador que se utilizar en el curso ser del tipo simblico llamado xdb,
con simblico indicamos que se puede depurar o trazar cualquier programa escrito
en los lenguajes C, Pascal y Fortran incluso en C++.
En el entorno HP tambin existen otros depuradores como el xcdb concebido para
trabajar en entornos X.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.3.- DEBUGGER : El depurador en el proceso de desarrollo.
Como hemos dicho antes la utilizacin del depurador es posterior al proceso de
compilacin.
Del proceso de compilacin el depurador utiliza el cdigo ejecutable del programa
a revisar as como el cdigo fuente del programa para visualizarlo en la sesin de
trabajo.
El cdigo ejecutable del programa debe ser compilado de forma especial para que
pueda ser trazado, esto generar referencias y ms informacin que se utilizar por
el depurador para poder prestar sus servicios.
Preparacin del programa:
Para decirle al compilador que aada la informacin para el depurador
simblico se debe emplear la opcin -g, de la siguiente manera:
cc -g -o programa programa.c
Notar que el fichero /usr/lib/end.o ser automticamente enlazado con tu
programa, de forma que si se utiliza el enlazador directamente sera:
ld -o programa /usr/lib/end.o -lc
Debemos tener en cuenta tambin que cuando utilizamos esta opcin se
desactiva automticamente el optimizador de compilacin.
En relacin con el tipo de librera que se utiliza en la compilacin en relacin
al uso del depurador, por defecto se utilizan las libreras compartidas pero eso
redunda en que el cdigo de esas libreras no se puede tratar con este producto.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.4.- DEBUGGER : Formato general y opciones externas 1.
Cuando utilizamos el depurador simblico, el proceso del comando xdb es el padre del
programa que estas depurando.
El depurador controla solo el proceso hijo, y solo puede tratar un proceso hijo a
la vez.
El formato general del comando que invoca una sesin de depurador es:
$ xdb [ -ddireccin -rfich_grab -pfich_lee -Piden_proc
-ifich_ent -ofich_sal -efich_err ] [ fich_ejec [ fich_core ] ]
Con este comando tan solo arrancamos el proceso del comando xdb ( es decir ,
se entra en sesin depurador ), pero no comienza la ejecucin del proceso
hijo a depurar.
fich_ejec
Es el fichero que contiene el ejecutable del programa que queremos
depurar.
fich_core
Es el fichero que contiene las referencias e informacin de la interrupcin
de un programa que se estaba ejecutando y abort.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.5.- DEBUGGER : Formato general y opciones externas 2.
$ xdb [ -ddireccin -rfich_grab -pfich_lee -Piden_proc
-ifich_ent -ofich_sal -efich_err ] [ fich_ejec [ fich_core ] ]
Las opciones ms utilizadas son las siguientes:
Opciones:
-ddireccin
Especifica una direccin alternativa de los ficheros fuente.
-rfich_grab
Especifica el fichero de grabacin de la sesin del depurador.
-pfich_lee
Especifica el fichero de ejecucin de la sesin de depurador.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.6.- DEBUGGER : Formato general y opciones externas 3.
$ xdb [ -ddireccin -rfich_grab -pfich_lee -Piden_proc
-ifich_ent -ofich_sal -efich_err ] [ fich_ejec [ fich_core ] ]
Otras opciones son :
Opciones:
-Piden_proc
Especifica el identificador de proceso de un proceso en activo que el
usuario quiere depurar.
-ifich_ent
Redirecciona la entrada estndar al proceso hijo desde el fichero
designado o dispositivo de caracteres.
-ofich_sal
Redirecciona la salida estndar desde el proceso hijo hasta el fichero
designado o dispositivo de caracteres.
-efich_err
Redirecciona la salida de errores estndar desde el proceso hijo
hasta el fichero designado o dispositivo de caracteres.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.7.- DEBUGGER : Estructura de una sesin depurador 1.
La primera vista de una sesin depurador:
62: fscanf (rain_fall, "%d", &hold_rain_fall);
63: month_table[array_index] = hold_rain_fall / 100;
64: }
65: }
66:
67: main()
68: {
> 69: get_input();
70: load_month_table();
71: }
72:
73: /* @(#) A.08.00 HP-UX SYMBOLIC DEBUGGER / DEMOS $Revision: 1.4
File: demo.c Procedure: main Line: 69
Copyright Hewlett-Packard Co. 1985,1987-1992. All Rights Reserved.
<<<< XDB Version B.09.00 HP-UX >>>>
No core file
Procedures: 5
Files: 1
>
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.8.- DEBUGGER : Estructura de una sesin depurador 2.
La pantalla de sesin del depurador se divide en tres partes por defecto:
Partes de la pantalla de una sesin de depurador:
Ventana del fuente:
Esta localizada en la parte superior hasta la lnea resaltada.
Es el rea donde ves el cdigo fuente de tu programa, si tu terminal tiene 24
lneas por defecto te asignar 15 para este propsito, luego veremos como
se puede alterar este defecto.
Se puede visualizar a conciencia las lneas del programa incluso otros
programas que no estamos depurando.
La marca ">" en el margen izquierdo del cdigo indica la lnea activa en este
momento, cuando tu acabas de arrancar una sesin de depurador esta se
sita en la primera lnea ejecutable del programa.
Ventana de localizacin:
Es una lnea situada despus del cdigo fuente, esta en video inverso.
Muestra el fichero de programa que se esta visualizando, el nombre del
procedimiento, y el nmero de de la lnea activa.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.9.- DEBUGGER : Estructura de una sesin depurador 3.
La ltima de las ventanas es:
Ventana de comandos:
Est situada debajo de la ventana de localizacin ( lnea en video inverso ).
En este rea es donde tu puedes escribir tus peticiones al depurador,
tambin el mismo muestra los resultados obtenidos en esta seccin, incluso
la salida del programa que ests depurando aparece aqu.
La ventana hace scroll automticamente cuando se llena y esto no afecta a
las otras ventanas.
Esta ventana implementa el comando more por defecto cuando la salida que
debe mostrar es muy grande.
El depurador te muestra al final de esta ventana un prompt ">", es all donde
puedes introducir los comandos dirigidos a l, debes introducir todo el
comando en una lnea.
Notar que al principio de una sesin de depurador todava no se ha comenzado a
ejecutar el programa a depurar, este ser uno de los comandos que se podrn introducir.
En el resto del tema vamos a ver la diferentes instrucciones que se pueden ejecutar.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.10.- DEBUGGER : Comandos de visualizacin.
Primero veremos los comandos utilizados para visualizar el cdigo fuente, estos se
pueden utilizar tanto si el proceso del programa a depurar ( proceso hijo ) esta activo
como si no.
> v num
Visualiza la lnea num en la ventana del fuente.
> v fich_fuente :num
Visualiza la lnea num del fichero fich_fuente.
> v nom_proc
Visualiza la primera lnea del procedimiento nom_proc.
> + | - num
Visualiza num lneas antes ( - ) o num lneas despus de donde te
encontrabas situado.
> w num
Modifica el tamao por defecto de la ventana del fuente a num lneas.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.11.- DEBUGGER : Visualizar el cdigo ensamblador.
Se puede utilizar el depurador para tratar el programa sobre su cdigo en
ensamblador, es decir ir visualizando el cdigo ensamblador en vez del fuente.
> td
Cambia el modo de visualizacin para mostrar el cdigo en ensamblador,
la ventana del fuente quedara:
d0 0x00000000 d4 0x00000000 a0 0x0000004c a4 0xffeffe60
d1 0x401e8480 d5 0xffeffe58 a1 0x80007032 a5 0x00085cd0
d2 0x60000001 d6 0x80000000 a2 0x00001aac a6 0xffeffe48 <-- fp
d3 0x00000003 d7 0x00000021 a3 0x80007000 a7 0xffeffe48 <-- sp
pc = 0x00000680 ps = xnZvc
65: 0x00000668 _load_mo+00ca unlk %a6
0x0000066a _load_mo+00cc rts
0x0000066c _main link.l %a6,&0x0
0x00000672 _main +0006 movm.l &0,(%a7)
0x00000676 _main +000a fmovm.x &0,(0x0,%a6)
> 69: 0x00000680 _main +0014 bsr.l _get_input
70: 0x00000686 _main +001a bsr.l _load_month_table
71: 0x0000068c _main +0020 unlk %a6
0x0000068e _main +0022 rts
0x00000690 ___d_tra link.l %a6,&0x0
Para volver otra vez al modo de cdigo fuente tan solo habra que ejecutar el
comando td de nuevo.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.12.- DEBUGGER : Partir la ventana del fuente.
Tambin es posible poder visualizar a la vez tanto el cdigo fuente como el cdigo en
ensamblador.
> ts
Cambia el modo de visualizacin para mostrar el cdigo fuente y el cdigo
en ensamblador partiendo la ventana del fuente que quedara:
66:
67: main()
68: {
> 69: get_input();
70: load_month_table();
71: }
72:
Symbolic Mode
0x0000066c _main link.l %a6,&0x0
0x00000672 _main +0006 movm.l &0,(%a7)
0x00000676 _main +000a fmovm.x &0,(0x0,%a6)
> 69: 0x00000680 _main +0014 bsr.l _get_input
70: 0x00000686 _main +001a bsr.l _load_month_table
71: 0x0000068c _main +0020 unlk %a6
0x0000068e _main +0022 rts
Para volver otra vez al modo normal de trabajo (modo de visualizacin del cdigo
fuente o ensamblador depende desde donde se parti ) tan solo habra que
ejecutar el comando ts de nuevo.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.13.- DEBUGGER : Comandos de bsqueda.
Hay comandos que nos facilitan el localizar una cadena de caracteres en cdigo fuente
que estamos visualizando , son similares a los que implementa el editor vi.
> / cad_carac
Busca hacia delante en el fichero visualizado la cadena de caracteres
cad_carac.
Si no introduces una cadena de caracteres, repetir la bsqueda con la
ultima cadena que hayas utilizado en otra busqueda.
La cadena debe ser un literal, los caracteres comodines no son soportados.
> ? cad_carac
Busca hacia atrs en el fichero visualizado la cadena de caracteres
cad_carac.
Si no introduces una cadena de caracteres, repetir la bsqueda con la
ultima cadena que hayas utilizado en otra busqueda.
La cadena debe ser un literal, los caracteres comodines no son soportados.
> n
Repite la ltima bsqueda de tipo / o ? que se haya ejecutado.
> N
Repite la ltima bsqueda de tipo / o ? que se haya ejecutado, pero
cambiando la direccin ( si se hace / se repetir ? y viceversa ).
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.14.- DEBUGGER : Otros comandos de visualizacin.
Algunos comandos tiles relacionados con la visualizacin de la ventana del cdigo
fuente son:
> u
Actualiza el fuente y la ventana de localizacin muestra la situacin donde el
programa fue suspendido.
Es til para utilizarlo cuando se esta ejecutando el proceso a depurar.
> U
Limpia la pantalla de toda la informacin y la reescribe de nuevo.
Se utiliza este comando si se desconfigura la sesin y los mensajes del
depurador machacan las ventanas de la sesin.
> D "dir_busq "
Aade el directorio que especifiques al final de la lista de directorios
busqueda de ficheros fuentes. Solo se puede incluir un directorio dir_busq
cada vez.
> ld
Lista todos los directorios alternativos de busqueda cuando el depurador
intenta acceder a los ficheros de cdigo fuente.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.15.- DEBUGGER : Comandos de control de trabajo 1.
Despus de ver los comandos de visualizacin en los que no era necesario que el
proceso del programa que queramos depurar estuviera corriendo, vamos a ver ahora
los comandos relacionados con esa ejecucin.
> R
Hace que se ejecute el programa a depurar como un nuevo proceso hijo.
Si ya existe un proceso hijo ejecutndose, el depurador te pregunta primero
si quieres terminar el proceso hijo primero.
> r lista_argumentos
Hace que se ejecute el programa a depurar como un nuevo proceso hijo
pudiendo incluir argumentos para su ejecucin.
> s [ num ]
Ejecuta el programa paso a paso, ejecutando instruccin a instruccin,
parando despus de la ejecucin parcial. Si esta en modo cdigo fuente
ejecutar una lnea de instruccin cada vez, en cambio si lo hace en modo
ensamblado lo har cada instruccin mquina.
Si quieres ejecutar varias ordenes a la vez incluye num en la orden.
> S [ num ]
Ejecuta el programa rutina a rutina de la misma forma que el comando s.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.16.- DEBUGGER : Comandos de control de trabajo 2.
Algunos comandos ms para el control de la ejecucin del programa a depurar seran:
> g num_lnea | +num | -num
Para ir a ejecutar la lnea num_lnea o en su caso saltar o retroceder el
nmero de lneas num.
> k
Mata el proceso hijo activo, si existe. Debes dar confirmacin a este
comando.
> c [ num_lnea ]
Reanuda la ejecucin despus de un breakpoint, ignorando la seal
pendiente, si la hay.
Si se incluye num_lnea se aadir un breakpoint.
> C [ num_lnea ]
Reanuda la ejecucin despus de un breakpoint, permitiendo que la seal
que este pendiente, si la hay, sea recibida por el proceso hijo.
Si se incluye num_lnea se aadir un breakpoint.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.17.- DEBUGGER : Comandos de consulta de informacin 1.
Ahora veremos comandos para investigar sobre elementos del programa.
Es til el uso de estos comandos cuando se est ejecutando el programa que queremos
depurar.
> I
Da informacin referente al programa depurador y al programa a revisar.
Esta sera la respuesta de depurador antes de comenzar a ejecutar el
proceso hijo:
Version ........ HP98680-02B.09.00 HP-UX SYMBOLIC DEBUGGER (XDB)
$Revision: 72.74 $
Program ........ "demo.db"
Core file ...... None
Procedures ..... 5
Mapped Images .. 1
Child process .. None
Breakpoints .... 0 (Active)
Assertions ..... 0 (Active)
Macros ......... 0 (Suspended)
Recording ...... Suspended
Record file .... None
Record-all ..... Suspended
Record-all file None
Playback file .. None
Searches ....... NOT case sensitive
Address format . "%#10.8lx"
Bytes malloc'd . 64088
Run arguments .. ""
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.18.- DEBUGGER : Comandos de consulta de informacin 2.
Estos son algunos comandos para la visualizacin de variables del programa que
estamos depurando, pudiendo ser ejecutados cuando esta corriendo el proceso hijo.
> p nom_var [ = valor ] | + | - [ \ formato ]
Muestra el contenido de la variable de programa nom_var.
Si se incluye el signo = modificar el valor de nom_var para poder continuar
la ejecucin del programa a depurar con este valor en la variable.
Si utilizas el signo - + visualizars la variable que est situada fsicamente
antes o despus de la variable que hayas investigado antes. Has de tener
en cuenta que cuando utilizas esta opcin no te aparece el nombre de la
variable sino la direccin fsica seguida por el valor que contiene.
Si preguntas por el valor de una matriz ( o vector ) sin ndice el resultado
ser la direccin fsica donde comienza la matriz, si la tecleas con ndice te
mostrar el valor y la direccin fsica en octal de ese elemento en concreto.
Si incluyes la formula \formato podrs visualizar la variable con el formato
deseado, los ms utilizados son :
\o Octal.
\c Carcter.
\d Entero.
\x Hexadecimal.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.19.- DEBUGGER : Comandos de consulta de informacin 3.
Otros comandos para generar listados de variables y otros elementos del programa a
depurar.
> l [ proc ]
Lista todos los parmetros y variables locales del procedimiento activo
mostrando sus valores.
No se puede utilizar diferentes formatos de visualizacin, en cambio si se
puede especificar un nombre de procedimiento diferente al que esta activo y
te informa de las variables locales de l.
> t
Te muestra el contenido de la pila de los procedimientos que se estn
ejecutando con las lneas donde cedieron el control a las otras rutinas y los
valores de los parmetros de procedimiento.
> T
Combinacin de los comandos l y t, muestra el contenido de la pila de
procedimientos con las variables locales de cada uno de esos
procedimientos.
> lg >lp >lr >ls
Estos comandos listan respectivamente variables globales, procedimientos,
registros y variables especiales.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.20.- DEBUGGER : Introduccin a breakpoints.
Un breakpoint, cuando es encontrado, suspende la ejecucin del programa que se est
depurando en una localizacin particular.
Entonces un breakpoint es una seal que dejamos en el programa a depurar para que
cuando el control de ejecucin del programa pase por all, se suspenda la ejecucin y
podamos efectuar controles sobre el programa ( listado de variable, consulta de la pila de
procedimientos, modificacin de control de flujo del programa, modificacin de los valores
de las variables, etc )
Con los breakpoint podemos hacer varias operaciones como por ejemplo:
Listar los breakpoints con sus localizaciones.
Crear breakpoints en diferentes localizaciones.
Cambiar el estatus de los breakpoints.
Activar breakpoints de forma global.
Una vez que se ha encontrado un breakpoint puedes reactivar la ejecucin del programa
o por el contrario cancelar el proceso, incluso cancelar la sesin del depurador.
Los breakpoints aparecen en la ventana del fuente marcados con un asterisco (*).
Se puede asociar a cada breakpoint una lista de comandos a ejecutar por defecto
cuando se alcanza este breakpoint
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.21.- DEBUGGER : Comandos sobre breakpoints 1.
Daremos los comandos ms comunes a la hora de dar de alta breakpoints.
> b [ local ] [ \ cont ] [ { lista_de_comandos } ]
Crea un breakpoint en la localizacin denominada local , esta puede ser un
nmero de lnea, el nombre de una rutina, etc.
Tambin puedes utilizar el formato \ cont , con lo que creara un breakpoint a
un nmero de cont instrucciones ejecutables de la instruccin donde
estamos parados.
La lista de comandos que se puede asignar a este breakpoint deber ir
entre llaves y si hay varias ordenes se pueden encadenar con punto y
coma (;).
Una vez que has aadido un breakpoint el depurador te responde:
Overall breakpoints state: ACTIVE
Added:
2: count: 1 Active main: 16: if (n[a]%ESCALA==0)
> bt [ proc ] [ \ cont ] [ { lista_de_comandos } ]
Crea un par de breakpoints a la entrada y a la salida del procedimiento proc.
Las dems opciones son iguales a las comentadas en "> b".
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.22.- DEBUGGER : Comandos sobre breakpoints 2.
Estos comandos para listar y gestionar el estado de breakpoints.
> lb
Lista los breakpoints que existen en el programa, numerndolos,
visualizando su estado, la lnea donde residen, el cdigo de la lnea donde
residen, si tienen asignados comandos, etc.
> db num | *
Borra el breakpoint especificado con el nmero num, este se puede ver con
el comando lb.
Cuando se utiliza el asterisco (*) se borrarn todos los breakpoints del
programa.
> sb num | *
Suspende o desactiva el breakpoint especificado con el nmero num.
Cuando se utiliza el asterisco (*) se suspenden todos los breakpoints del
programa.
> ab num | *
Activa el breakpoint especificado con el nmero num.
Cuando se utiliza el asterisco (*) se activan todos los breakpoints del
programa.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.23.- DEBUGGER : Comandos sobre breakpoints 3.
> bpt {lista_de_comandos }
Establece breakpoints con procedimiento permanente en la primera y ltima
lnea ejecutable de todos los procedimientos. Es muy parecido al comando
bt pero sin ser para un solo procedimiento.
> Dpt
Borra los breakpoints establecidos por el comando bpt.
> abc { lista_de_comandos }
Define una lista de comandos global para todos los breakpoints.
As no es necesario definir en todos los breakpoints la misma lista de
comandos.
Esta lista de comandos se ejecutar antes de la lista propia de cada
breakpoint.
Por ejemplo: >abc { l ; lg ; c }
> dbc
Borra la lista de comandos definida por el comando abc.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.24.- DEBUGGER : Comandos sobre breakpoints 4.
Son interesantes algunas rdenes que se pueden incluir en las listas de procedimientos
de los breakpoints, veremos aqu dos de las ms importantes:
" cadena_de_caracteres "
Causa que cadena_de_caracteres sea visualizada por la ventana de
comandos.
i expresin { lista_de_comandos1 } [ { lista_de_comandos2 } ]
Hace que se ejecuten condicionalmente comandos en una lista de
comandos.
Si la expresin toma valor distinto de cero, la lista_de_comandos1 es
ejecutada, si por el contrario es cero se ejecutar lista_de_comandos2.
Un ejemplo podra ser:
>b proc { Q ; if ( var > 0 ) { p var ; p lista } ; c }
Q
Suprime los mensajes del depurador cuando un breakpoint es alcanzado.
Tiene que ser la primera orden en una lista de comandos, ya que si no sera
ignorado.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.25.- DEBUGGER : Aserciones 1.
Una asercin es una lista de de uno o ms comandos de depurador que son ejecutados
antes de cada instruccin mquina.
Las aserciones son muy tiles para depurar graves defectos en programas, como pueden
ser los problemas con variables globales o misteriosos efectos laterales.
Las aserciones pueden ser activadas o desactivadas individualmente. Cuando una
asercin es suspendida, la informacin de la asercin es retenida, pero no ser evaluada
durante la ejecucin del programa.
Es muy til tambin el uso de las instrucciones i, Q y "mensaje" en la construccin de las
listas de comandos de las aserciones.
Estos son algunos comandos relacionados con la gestin de aserciones:
> a { lista_de_comandos }
Crea una asercin consistente en la lista_de_comandos que tu introduzcas.
Los problemas de construccin de la lista_de_comandos no se identificarn
hasta que no se ejecute la asercin y no en el momento de crear la asercin.
Si se produce un error, el mensaje correspondiente a este error se mostrar
en pantalla y la ejecucin se paralizar.
Un ejemplo muy frecuente puede ser el siguiente:
a { i ( var_global > 90000 ) { p var_global ; x } }
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.26.- DEBUGGER : Aserciones 2.
> la
Lista todas las aserciones que tienes en tu programa, te da la siguiente
informacin:
- Nmero que identifica a la asercin.
- Estado en el que se encuentra la asercin (activo, suspendido).
- Lista de los comandos de las aserciones.
> da nmero | *
Borra la asercin identificada por el nmero que t le indiques, en el caso de
utilizar el asterisco ( * ), se borrarn todas las aserciones que haya.
> sa nmero | *
Hace que se suspenda la asercin que se identifique con el nmero que se
adjunta o todas las aserciones si se utiliza el asterisco ( * ).
El estado de la asercin se ve modificado, se puede visualizar con el
comando "la".
En otro momento se puede volver a activar de forma cmoda.
> aa nmero | *
Hace que se reactive una asercin que estaba en suspenso.
Sera aquella que se identifique con el nmero que se adjunta.
Si se utiliza el asterisco ( * ) se har con todas las aserciones .
El estado de la asercin se ve modificado, se puede visualizar con el
comando "la".
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.27.- DEBUGGER : Grabacin de una sesin depurador.
Vamos a ver ahora las posibilidades que presenta el depurador para poder grabar una
sesin de tratamiento de cdigo y despus poder reproducirla.
Nota importante: los comandos que veremos aqu no incluyen el prompt del depurador,
quiere decir que el propio comando incluye un ">".
> nombre_fichero
Establece el fichero de grabacin a nombre _fichero, si estaba ya
establecido lo cambia por el especificado, a partir de ese momento se
grabar la sesin en ese fichero.
Si el fichero existe se grabar encima de su contenido.
>> nombre_fichero
Hace lo mismo que la anterior orden pero aadiendo el contenido a
nombre_fichero si ya exista.
>
Visualizas el estado de grabacin, es decir te informa si estas grabando o
no.
Esta orden no se grabar en el fichero si es cierto que ests guardando la
sesin de depuracin.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.28.- DEBUGGER : Grabacin de una sesin depurador 2.
Algunos comandos ms:
> c
Cierra el fichero de grabacin de la sesin de depuracin.
>@ nombre_fichero
Hace lo mismo que " > nombre_fichero ", con la salvedad que tambin
guarda en el fichero de grabacin las respuestas del depurador y no solo
los comandos como cuando utilizbamos el comando sin arroba ( @ ).
Paralelamente se puede utilizar el smbolo arroba ( @ ) con las dems ordenes
obteniendo un significado similar al ya comentado.
Se podra utilizar:
>> @ nombre_fichero > @ > @ c
Y por fin los comandos de reproduccin de la sesin.
< nombre_fichero
Comienza la reproduccin de una sesin de depuracin.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.29.- DEBUGGER : Grabacin de una sesin depurador 3.
Aunque es preferible utilizar el siguiente comando ya que proporciona ms posibilidades:
<< nombre_fichero
Hace que comience la reproduccin de la sesin grabada en
nombre_fichero, utilizando la forma de ejecucin llamada "una lnea
cada vez".
Cada lnea de comando del fichero de reproduccin es visualizada antes de
que sea ejecutada, y es el propio depurador el que te proporciona una lista
de opciones para gestionar la ejecucin del fichero.
Son estas:
<cr> Salto de lnea, ejecuta una lnea de comandos del fichero.
S Salta una lnea de comandos del fichero sin ejecutarla.
<num> Ejecuta el nmero de lneas de comandos que se especifiquen.
C Continua ejecutndose todo el fichero.
Q Hace salir del modo de reproduccin de sesin.
? Te muestra una pequea ayuda.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.30.- DEBUGGER : Otros comandos 1.
Algunos comandos tiles para la gestin del depurador pueden ser:
> def nombre texto
Define macros de manera que a partir de la ejecucin del comando cuando
utilicemos la palabra nombre el depurador la cambiar por texto.
> lm
Lista las macros que existen.
> undef nombre | *
Borra la asignacin que haba entre nombre y el texto al que reemplazaba.
Si se utiliza el asterisco ( * ) se borraban todas las asignaciones.
> ! comando
Hace que se ejecute el comando del sistema operativo comando .
> #
Toma como comentario lo que insertes despus del signo ( # ).
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
6.31.- DEBUGGER : Otros comandos 2.
Y los ltimos son:
>
Repite de nuevo el ltimo comando ejecutado.
> q
Para salir de la sesin, adems te pide confirmacin.
> sm
Suspende la paginacin en caso de que sobrepase el tamao mximo, la
salida se visualizar ejecutando un scroll.
> am
Activa la paginacin suspendida con "sm".
> h
Te muestra una ayuda.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
7.1.- DOCUMENTACION : Introduccin.
Introduccin
Un paso ms en el desarrollo de una aplicacin es la elaboracin de la
documentacin anexa.
Cuando desarrollamos software debemos producir multitud de documentos,
algunos ejemplos son:
Estudios de viabilidad del proyecto informtico.
Documentos de la planificacin del proyecto.
Documentacin procedente del anlisis funcional del proyecto y diseo de
los datos que se utilizarn.
Cuaderno de cargas de la aplicacin o especificacin del diseo de los
programas.
Cuadernos de mantenimiento del software.
Manuales de procedimiento de usuario.
En este captulo explicaremos un conjunto de herramientas o programas
orientadas a la produccin de documentacin sobre este ltimo captulo,
basndonos en el modelo de documentacin que nos proporcionaba el
comando man.
Veremos someramente el funcionamiento de los comandos man, nroff, catman, tbl,
compress, etc.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
7.2.- DOCUMENTACION : Consulta del manual
Recapitularemos sobre el funcionamiento de comando que proporcionaba ayuda sobre
los comandos de la aplicacin ( man ).
Comando man
$ man [1234579m -k] comando | palabra_clave
El comando man se utiliza para buscar informacin en el manual de referencia
las opciones que damos aqu son :
man -k palabra_clave Lista todos los comandos que tienen la
cadena palabra_clave en su descripcin.
man [1234579m] comando Busca y muestra la informacin sobre
comando en la seccin de manual
especificada.
man comando Busca y muestra la informacin sobre
comando en todo el manual de referencia.
Esta documentacin esta proporcionada por los fabricantes del sistema, con el propsito
de apoyar las labores del usuario de los comandos del sistema.
Veremos como somos capaces de generar este tipo de documentacin y que
herramientas pone el sistema para ayudarnos en esta tarea.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
7.3.- DOCUMENTACION : Organizacin de la ayuda man.
Configuracin de la ayuda en un sistema Unix.
Man va a buscar pginas para visualizar en varios directorios. Su bsqueda
terminar cuando la entrada haya sido encontrada en uno de ellos o cuando se
hayan terminado los directorios en los que buscar.
Por defecto el comando man busca posibles referencias de la entrada en los
directorios /usr/man, /usr/contrib/man y /usr/local/man, adems por este orden.
Se utiliza la variable del entorno MANPATH para cambiar este defecto, el comando
leer esta variable e ir buscando alguna referencia a la entrada.
Tipos de ficheros ayuda en un sistema Unix.
En cada uno de los directorios de ayuda vamos a encontrarnos diferentes tipos de
ficheros agrupados segn su formato en cuatro posibles subdirectorios:
man* Ficheros que contienen cdigo texto procesable
con el procesador nroff.
man*.Z Contiene el mismo tipo de ficheros que man* pero
tratados con la utilidad compress que comprime
ficheros.
cat* Ficheros tratados con la utilidad nroff preparados
para ser visualizados con cualquier filtro.
cat*.Z Ficheros del mismo tipo que cat* pero
comprimidos.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
7.4.- DOCUMENTACION : Comando catman.
En tu sistema hay un fichero especial llamado /usr/lib/whatis que utiliza el comando man
con la opcin -k, donde estn las primeras lineas de cada posible entrada del manual
este fichero se crea y actualiza con el comando catman.
$ catman [ -m ] [ -n ] [ -p ] [ -z ] [ secciones . . . ]
Este comando tambin tiene otra funcin y es crear masivamente todos los ficheros
cat* y cat*.Z desde sus equivalentes man* y man*.Z, despus de su creacin si
nosotros deseamos suprimir alguno de estos ficheros podramos hacerlo.
Este comando esta incluido dentro de los de administracin del sistema, es
recomendable que su uso se comente con el administrador del sistema.
El comando se encuentra en /etc.
OPCIONES:
-m Renueva el fichero whatis con las entradas de
manual que no existieran en l, generando
tambin los ficheros cat*.Z.
-n Previene de la creacin del fichero whatis.
-p Informa de las tareas que est realizando.
-w Actualiza solo el fichero whatis.
-z Crea los ficheros cat* en sus respectivos
directorios sin dar de alta la versin comprimida
de ellos.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
7.5.- DOCUMENTACION : Gestin de la ayuda.
Como trabaja en ejecucin el comando man.
El comando man utiliza la versin ms reciente de los ficheros que vamos a
especificar en los directorios asignados para contener pginas de manual. Si
encuentra la versin ms reciente en:
man*.Z La entrada es descomprimida, formateada y
visualizada. Si el directorio cat*.Z existe, la
entrada formateada es comprimida e instalada en
cat*.Z. Si el directorio cat* existe la entrada
formateada es instalada en cat*.
cat*.Z La entrada es descomprimida y visualizada.
man* La entrada es formateada y visualizada. Si el
directorio cat*.Z existe, es comprimido e instalado
en cat*.Z. Si el directorio cat* existe, la entrada
formateada es instalada en cat*.
cat* La entrada es visualizada.
Si solo existen los directorios cat* o cat*.Z y nroff no esta instalado solo las
entradas que ya estn instaladas podrn ser visualizadas.
Existe la variable del entorno PAGER que te permite escoger el filtro para visualizar
las pginas del manual que hayas seleccionado, debers incluir entre comillas
dobles el comando con las opciones que desees, recordar algunos filtros como por
ejemplo cat, more, less, pr, pg, etc. Por defecto el comando man utiliza more y si
utilizas el comando man con la nica opcin - no se utilizar ninguno de ellos.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
7.6.- DOCUMENTACION : Formateador nroff 1.
Una de las herramientas bsicas para creacin de documentacin gestionada por man
es el tratador de textos nroff.
$ nroff [ -olista ] [ -nnum ] [ -mfich_macros ] fichero . . .
Nroff es un formateador de texto que interpreta el cdigo fuente contenido en un
fichero que damos como entrada y lo prepara para imprimirlo o visualizarlo
dependiendo del dispositivo que utilicemos.
Este formateador de ficheros tiene multitud de opciones y especificaciones de
entrada ( caracteres procesables de forma especial para generar la salida con
formato ), pero solo veremos unos pocos conceptos para que sea el usuario de
este comando el que profundice en este tema.
Si el fichero de entrada solo contiene texto sin estructuras de de formateo, nroff
utiliza las longitudes por defecto de linea y de pagina para producir un texto
legible, inserta una linea en blanco por cada linea de entrada y ajusta el texto
sobre los mrgenes.
Ignora los caracteres de texto que comiencen por punto, tomndolos como
especificaciones de formateo.
Las especificaciones de formateo son muy diversas, se suelen utilizar macros que
comprenden ms de una especificacin en un carcter, para utilizarlas se deben
indicar en el comando las opciones especiales necesarias.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
7.7.- DOCUMENTACION : Formateador nroff 2.
$ nroff [ -olista ] [ -nnum ] [ -mfich_macros ] fichero . . .
Algunas de las funciones de el formateador nroff son definir encabezamientos, pies
de pgina, tipos de letra, caractersticas del texto, etc.
Los caracteres especiales que reconoce nroff son mltiples y su descripcin
excedera el mbito del curso de todas maneras veremos algunas macros o
agrupaciones de estos caracteres especiales que se utilizan para la produccin
de pginas de manual o texto matemtico.
Algunas de las opciones que se pueden incluir cuando se invoca nroff son:
-olista Produce por la salida solo las pginas que se
indiquen en lista, de forma que:
num1- Indica las pginas num1 hasta
el final.
-num2 Indica las pginas desde el
comienzo a num2.
num1-num2 Indica las pginas desde
num1 a num2.
-nnum3 Numera las primeras pginas hasta num3.
-mfich_macros Utiliza las macros especificadas por nombre, las
libreras ms usuales de macros son las
denotadas por m y por an.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
7.8.- DOCUMENTACION : Formateador nroff 3.
Macros de nroff.
Los ficheros de macros que se utilizan para la produccin de pginas del manual
son /usr/lib/macros/cmp.n.d.an y /usr/lib/macros/ucmp.n.an que son invocados
cuando se utiliza la opcin -man del formateador de textos nroff.
Las macros ms importantes utilizadas son:
.THttulo seccin titulo_aux Para poner el encabezamiento de la
entrada de manual, donde se referencia
ttulo seccin del manual al que esta
adscrita la entrada y un ttulo auxiliar.
.SHtexto Inserta una seccin en la pgina de manual.
.SStexto Para introducir una subseccin de manual,
con sus correspondientes indentaciones.
.B .I Hace el texto en video inverso o letra itlica
respectivamente.
.PP Comienzo de un prrafo de con tipo de letra
normal, implica un salto de linea.
.TPnum Definicin de prrafo indentado, el nmero
num indica el nmero de columnas de
separacin.
Tambin hay algunas macros utilizadas para el cambio de tipo de letra dentro de una
misma linea.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
7.9.- DOCUMENTACION : Preprocesador de tablas tbl 1.
Otra de las utilidades orientadas a la produccin de documentacin, en concreto para la
fabricacin de tablas, es el comando tbl.
$ tbl fichero_fuente
Tbl es un preprocesador que genera cdigo procesable por nroff para la
produccin de tablas formateadas.
El fichero_fuente puede estar compuesto por cdigo nroff y cdigo procesable por
el comando tbl.
Solo se preprocesarn las lineas que estn situadas entre los caracteres
especiales .TS y .TE, las dems entradas no las modifica.
Los caracteres que se pueden incluir para preprocesar pueden ser opciones
globales o letras clave.
La salida del comando ser cdigo totalmente procesable por nroff.
La utilizacin prctica de este comando se ve en el siguiente ejemplo:
$ tbl fich_con_tabla | nroff -man | col | more -s
Con esto la primera parte preprocesara la tabla luego la salida sera formateada
globalmente por nroff soportando las macros de an, esta salida a su vez es tratada
por col para cambiar espacios en blanco y saltos de pgina y por fin se pagina la
salida omitiendo lineas en blanco generadas por nroff ( opcin -s ).
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
7.10.- DOCUMENTACION : Preprocesador de tablas tbl 2.
Estructura del cdigo procesable por tbl.
La estructura de la tabla viene dada en tres partes, la primera indica opciones
globales a toda la tabla, la segunda muesta la estructura de campos de cada linea
de la tabla y la ltima contiene los datos que se van a visualizar en ella.
En la primera parte se separarn las opciones globales con espacios en
blanco terminando con punto y coma ;.
En la segunda parte de esta estructura se incluirn las letras claves y los
caracteres especiales nroff que indican las caractersticas de escritura que
va ha tener el texto, tambin se incluye la barra vertical para indicar que se
debe incluir una linea horizontal entre esos dos campos. En esta segunda
parte existir una entrada por cada una de las lineas con formato diferente
en la tabla. Para terminar esta parte se incluir un punto.
En la tercera parte solo se admitir texto, el carcter especial de separacin
entre campos y los caracteres de divisin horizontal _ y =.
Ejemplo.
.TS
center box tab(;) ;
cB s s
l | n n.
Temperaturas
_
Zaragoza;13;3
Teruel;8;1
.TE

Temperaturas
Zaragoza
Teruel
13 3
8 1
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
7.11.- DOCUMENTACION : Preprocesador de tablas tbl 3.
Caracteres utilizables en un fichero fuente de tbl.
Opciones globales:
center Para centrar la tabla.
box Para encerrar la tabla en una caja.
doublebox Para encerrar la tabla en una doble caja.
allbox Para encerrar cada campo en una caja.
tab ( signo ) Para definir el separador entre campos.
Letras clave:
c Para centrar el campo sobre la columna.
r Ajuste a la derecha del campo.
l Ajuste del campo a la izquierda.
n Ajuste numrico del campo.
s Expandir el campo anterior a esa columna.
^ Expandir el campo de arriba a esa lnea tambin.
_ = Lineas horizontales y dobles lneas horizontales.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
8.1.- LEX : Introduccin.
Que es lex ?
El comando lex es un generador de programas que se utilizarn para el
procesamiento lxico de cadenas de caracteres.
Este comando acepta problemas de alto nivel ( no especificados formalmente ),
orientados al tratamiento de cadenas de caracteres y produce un programa en C
que gestiona la entrada proporcionada al programa produciendo una salida
elaborada, para ello el programador lex debe utilizar unas cadenas de caracteres
especiales llamadas "expresiones regulares".
Las expresiones regulares deben ser especificadas por el usuario en el fichero
fuente que ser entrada para el comando lex.
El cdigo que generar lex en C se formar con estas expresiones regulares y otro
cdigo que completa la gestin total del programa.
El usuario tiene la posibilidad de introducir cdigo en C dentro de las
especificaciones de entrada del comando lex, con lo que el programa generado
contendr tambin este cdigo y procesar de forma especfica algunos de los
casos que plantee el problema.
Normalizacin de lex
El cdigo generado por las utilidades lex es hoy por hoy mayoritariamente C, pero
tambin existen lex generadores de Ratfor y sera posible utilizar otros lenguajes.
Las especificaciones que sigue el diseo de lex son POSIX.2 y XPG3.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
8.2.- LEX : Fases del procesamiento 1.
Como se produce un ejecutable lex.
Las partes del proceso de generacin de programas utilizando el comando lex son
las siguientes:
1 Construyes un fichero que contendr las especificaciones de proceso
que quieres que se realicen, es decir construyes el programa fuente de lex.
$ vi fichero_fuente
2 Ejecutas el comando lex con la entrada del fichero fuente.
$ lex fichero_fuente
3 El comando lex habr generado un fichero que contenga cdigo en C, el
cual puede ser modificado si es necesario, por defecto el fichero se
denomina lex.yy.c.
$ ls
fichero_fuente lex.yy.c
$ vi lex.yy.c
4 Compilar el fichero en C, adjuntando la librera de funciones de utilizacin
lex.
$ cc -o programa.exe lex.yy.c -l
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
8.3.- LEX : Fases y utilidad de lex.
Como se produce un ejecutable lex.
Por ltimo quedara:
5 Ejecutar o llamar el programa desde otro programa, este proceso en
ejecucin tomar las cadenas de caracteres que se le proporcionen como
entrada, las examinar para ver si cumplen algunas de las condiciones que
se especificaron en el fichero fuente y si las cumplen ejecutar las acciones
asignadas produciendo una salida procesable por otros programas.
$ programa.exe fichero_datos_entrada
Uso de los programas producidos por lex.
El comando lex puede ser usado solamente para simples trasformaciones de las
entradas, o para analizar y filtrar estadsticamente a nivel lxico estas entradas.
Es decir hacer un estudio de la informacin de entrada utilizando similitudes
lexicogrficas de estos datos.
Lex puede ser usado en combinacin con un generador de programas
analizadores, como yacc, el programa generado por lex sera un primer paso del
proceso y se encargara de normalizar las entradas del exterior para que sea el
programa generado por yacc el que analice las entradas ya normalizadas, este
caso podra darse en la construccin de un compilador.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
8.4.- LEX : Formato del comando lex.
$ lex [ -rctv ] [ -Xletra nmero ] [ fichero_fuente . . . ]
El comando tiene como misin generar un programa en C que analice
lexicogrficamente textos. El programa generado se llamar lex.yy.c.
En el fichero fichero_fuente se incluyen las especificaciones para la generacin
de dicho programa, se pueden incluir varios fichero_fuente y los considerar como
uno solo.
OPCIONES:
-r Indica que el cdigo utilizado dentro del fichero
fuente esta escrito en Ratfor.
-c Indica que el cdigo utilizado dentro del fichero
fuente esta escrito en C, esta opcin esta
determinada por defecto.
-t Produce que el fichero lex.yy.c sea escrito por el
canal de salida estndar.
-v Produce un resumen estadstico del proceso.
-Xletra nmero Cambia el defecto de dimensionamiento de
diversas tablas utilizadas en lex.yy.c, se incluye la
letra para especificar la tabla y nmero para
indicar la dimensin de la tabla. Un ejemplo de
letra es d para la tabla de definiciones.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
8.5.- LEX : Formato de un fichero fuente de lex 1.
Formato general del fichero de especificaciones en lex.
El formato general de un fichero fuente de lex es:
{ definiciones }
%%
{ acciones }
%%
{ subrutinas de usuario }
Siendo %% caracteres especiales.
Partes del fichero.
La estructura de la parte central, de las acciones se compone de:
En una primera columna se indican las expresiones regulares.
En la columna de la derecha se introducen las acciones, fragmentos de
programa que sern ejecutados cuando las expresiones regulares sean
reconocidas.
Estas dos columnas deben estar separadas por marcas de tabulador.
La parte central del fichero es la zona ms importante del fichero donde se dan las
directrices de proceso.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
8.6.- LEX : Formato de un fichero fuente de lex 2.
Funciones de las partes del fichero.
Si la accin es solo una expresin en C puede indicarse en la misma linea de la
expresin regular, si en cambio esta compuesta de varias deber ir flanqueada de
llaves { }.
El programa que se genere buscar en la entrada una cadena de caracteres que
cumpla o se ajuste a una expresin regular, cuando lo consiga se ejecutarn las
acciones ( ordenes en C o funciones de librera ), encaminadas a generar una
salida procesada.
Las otras dos partes se pueden considerar como accesorias y contienen
definiciones y rutinas de utilizacin en la parte central o de accin.
Ejemplo bsico.
Se pueden omitir las definiciones y las subrutinas de usuario, si ocurre esto los
segundos smbolos %% son opcionales, pero los primeros son obligatorios. Quiere
esto decir que el mnimo programa fuente de lex vlido es:
%%
Este programa lo nico que hara es leer la entrada y sin modificar nada producir la
salida.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
8.7.- LEX : Expresiones regulares 1.
Concepto.
Una expresin regular especifica un conjunto de cadenas que se van a buscar
sobre un texto.
Esto se consigue mediante la mezcla de unos caracteres especiales con
significado capaz de generar un conjunto de caracteres.
Tipos de caracteres de una expresin regular.
Las expresiones regulares contienen caracteres de texto ( que van a especificar
las cadenas que se van a buscar ) y caracteres de operacin ( que especifican
repeticiones, decisiones y otras tareas ).
Las letras del alfabeto y los nmeros son siempre caracteres de texto, por ejemplo
el conjunto de cadenas de caracteres que define la expresin regular "kjdf975aks"
es solamente una cadena igual a la expresin regular.
Los caracteres de operacin son caracteres especiales. Esta es la lista de todos
ellos:
" \ [ ] ^ - ? . * + | ( ) $ / { } % < >
Ahora veremos el significado especial de los ms utilizados, cada uno de ellos
tiene una significado diferente.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
8.8.- LEX : Expresiones regulares 2.
Supresin de significado especial de un carcter.
Hemos visto los dos tipos de caracteres que forman una expresin regular veamos
ahora como se cambia un carcter de operacin a texto:
" " Las dobles comillas tienen la funcin de que todos los
caracteres incluidos entre ellas se tomarn como
caracteres de tipo texto.
Por ejemplo veremos que la expresin regular:
kjsdk+
Ser diferente a:
"kjsdk+"
Ya que el signo + en la primera expresin lo tratar de forma especial y la
segunda ser otro carcter de texto ms, en este caso intentar buscar la
cadena kjsdk+.
\ La barra invertida quita el significado al carcter de
operacin que le sigue convirtindolo en un carcter de
texto.
La expresin regular "kjsdk+" sera equivalente a kjsdk\+.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
8.9.- LEX : Expresiones regulares 3.
Otros significados de \.
El carcter de operacin \ tiene dos significados diferentes adems del visto en la
anterior transparencia, uno es que se puede representar un carcter ascii uniendo
este signo al nmero ascii del carcter correspondiente, por ejemplo \40 es el
carcter blanco y otro es que adjuntando una letra a \ se indican caracteres de
control, por ejemplo \n es salto de lnea.
Caracteres de operacin para indicar varios caracteres texto.
. El punto representa cualquier carcter excepto el
carcter de salto de lnea, en la posicin que ocupe el
punto.
Por ejemplo: h9.jd como expresin regular representa
todas las cadenas de caracteres de longitud 5 que tengan como primeros
caracteres h9 y ltimos jd.
[ ] Los corchetes definen un grupo de caracteres posibles
en la posicin deseada.
Un ejemplo sera: con[aeioup]9i representa el conjunto de cadenas:
cona9i cone9i coni9i cono9i conu9i conp9i, las cuales buscar en el texto de
entrada.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
8.10.- LEX : Expresiones regulares 4.
Caracteres de operacin auxiliares a [ ].
Los corchetes se pueden utilizar con otros caracteres de operacin que los
complementan, estos se situarn dentro de los corchetes, son:
- El guin define el rango segn los cdigos ascii
correspondientes.
Un ejemplo que muestra el uso del guin sera: libr[a-dA-D0-3]
equivaldra a la expresin regular: libr[abcdABCD0123].
^ Hace la complementacin de los caracteres
indicados, se incluye en la primera posicin tras el
corchete izquierdo.
La expresin: ks[^a-zA-Z] representa las palabras que
comienzan con ks y en la tercera posicin contiene un carcter
que no sea una letra ni mayscula ni minscula.
\ Tiene el mismo significado que sin corchetes.
Por ejemplo: [\^hi]99 sera el equivalente a indicar el
conjunto de cadenas: ^99, h99, i99 situadas todas ellas
en cualquier posicin del texto.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
8.11.- LEX : Expresiones regulares 5.
Repeticin de caracteres.
Se utilizan dos caracteres especiales que son:
* El asterisco indica la repeticin del carcter
anterior un nmero aleatorio de veces incluida
ninguna.
Por ejemplo la expresin regular:ji*l representa las cadenas
de caracteres jl, jil, jiil, jiiil, etc.
+ Indica lo mismo que * pero al menos una
repeticin.
En el caso anterior modificado: ji+l representa las mismas
cadenas de caracteres que ji*l excepto la formada por jl.
Estos dos caracteres de operacin se pueden combinar con los anteriormente
descritos.
Existencia de carcter.
? La interrogacin indica que puede o no estar el
anterior carcter en las cadenas buscadas.
Por ejemplo ab?c representa las cadenas ac y abc.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
8.12.- LEX : Expresiones regulares 6.
Caracteres de operacin miscelneos.
Los caracteres ^ y $ indican:
^ Al comienzo de la expresin regular indica que las
cadenas que se busquen deben estar al comienzo
de la lnea.
Se asociara la expresin: ^Do[n]a? a las cadenas: Don,
Doa, Do, Dona siempre que estn situadas al comienzo de una
lnea.
$ Al final de la expresin regular indica que las
cadenas que se busquen deben estar al final de la
lnea.
La expresin: adis$ solo representa a las palabras
"adis" que estn situadas al final de una lnea.
La combinacin de los caracteres de operacin ( y | indica:
| Hace que se seleccione un carcter texto u otro de
los situados a derecha e izquierda del smbolo.
Mejorando el ejemplo anterior: ^Do(n|a) representa las palabras
Don y Doa.
S. O. UNIX . HERRAMIENTAS DE PROGRAMACION
8.13.- LEX : Lgica de un programa lex.
Como funciona un programa generado con lex ?.
La gestin del programa resultante seguir los siguientes principios:
Se pueden incluir tantas expresiones regulares como quieras con sus
acciones asociadas.
La entrada se procesa secuencialmente, cuando se detecta que una
expresin regular esta siendo cumplida, el programa se prepara para
ejecutar la accin, si son dos las expresiones regulares las que se estn
cumpliendo se ejecutar la accin de la expresin regular que genera la
cadena de caracteres ms larga.
Cuando se realiza una accin el proceso comienza desde donde se termin
de extraer la cadena de caracteres que se seleccion.
En el caso que una entrada no se corresponda con ninguna expresin
regular la entrada no se ve modificada y directamente se reproduce en la
salida.
Un ejemplo que puede ilustrar estos conceptos puede ser:
Dada cadena de entrada "El coche rojo arrojo barro al cochero", si la tratamos con los
programas producidos por los ficheros fuentes lex que contienen el cdigo:
%% %%
coche.* printf(" xito1 "); coche[^ \t \n]* printf(" xito1 ");
rojo printf(" xito2 "); rojo printf(" xito2 ");
Generaran " el xito1 " y " el xito1 xito2 ar xito2 barro al xito1 " respectivamente.
8.14.- LEX : Seccin de acciones del fichero fuente.
Acciones del fichero fuente.
Las acciones que se colocan en la segunda columna despus de las expresiones
regulares son como hemos dicho expresiones en C, pero veamos algunas
excepciones:
Si no incluimos accin por defecto no procesar nada especial y esa
entrada no tendr salida.
Se puede incluir como accin el signo | con lo que el programa sabr que la
accin asignada a esa expresin regular es la de la siguiente expresin
regular.
Existe una librera especifica de utilizacin en programas fuentes de lex, que
se llama libl, incluye funciones prcticas para la construccin de acciones,
veremos algunos ejemplos de funciones.
Funciones propias de lex.
Funcin yytext contiene la cadena de caracteres con la que se a obtenido xito al
validar las expresiones regulares.
Funcin yyleng contiene el numero de caracteres de la cadena que devuelve
yytext.
Funcin yywrap es llamada automticamente por el programa lex cuando detecta
un fin de fichero por la entrada, es muy til la redefinicin de esta funcin en la
zona de subrutinas del usuario.
Funcin REJECT hace que se procesen los otros posibles xitos en la
comprobacin de expresiones regulares, anula la tercera norma de gestin del
programa en lex que vimos.
8.15.- LEX : Seccin de definiciones.
Seccin de definiciones.
La seccin de definiciones puede contener:
Macros utilizables en la zona de las expresiones regulares.
Por ejemplo es corriente encontrar en programas de gestin numrica
las definiciones:
D [0-9]
E [DEde]
%%
{D}{E} Accin;
Para la referencia de macros en las expresiones regulares es
necesario el uso de llaves { }.
Variables utilizadas en las acciones y subrutinas de usuarios.
int i;
%%
hola {
i++;
printf(" hola nmero %d",i);
}
Tambin se puede incluir cdigo de ficheros tipo include con el formato:
%{
#include <fichero.h>
%}
8.16.- LEX : Seccin de subrutinas de usuario.
Seccin de subrutinas de usuario.
La seccin de definicin de subrutinas de usuario es recomendable usarla cuando
las acciones asociadas a las expresiones regulares son complejas.
Estas funciones aqu incluidas se podrn invocar desde la seccin de acciones.
Tambin es muy til para redefinir funciones de librera como hemos visto con
yywrap.
Ejemplo.
D [0-9]
E [DEde][-+]?{D}+
int i;
%%
{D}+ entero();
{D}+"."{D}*({E})? |
{D}*"."{D}+({E})? |
{D}+{E} real();
%%
entero()
{
i++;
printf("\n el numero encontrado en la posicin %d es entero \n",i);
}
real()
{
i++;
printf("\n el numero encontrado en la posicin %d es real \n",i);
}

ANEXOS HERRAMIENTAS DE PROGRAMACION UNIX
===============================================
Los ejemplos que aqui se presentan fueron utilizados como ejemplos reales
para el curso de "Herramientas de programacin Unix", impartido por el Servicio de
Informacin-Centro de Clculo de la Universidad de Zaragoza.
Estos ejemplos han sido recogidos por el autor de diversas fuentes, tanto de
programas reales del sistema HP-UX como de programas propios del Centro de
Clculo.
Los ejemplos que se muestran son:
9.1. Shell scripts, filtro de impresora y parche para modificar sendmail.
9.2. Programa en C para simular el lanzamiento de un dado.
9.3. Programa en C con una sesin debugger grabada.
9.4. Makefiles de instalacin del editor asedit y traductor de Pascal a C (p2c).
9.5. Informe generado por gprof sobre la ejecucin del programa 9.3.
9.6. Pgina de manual no formateada y fichero fuente de tbl.
9.7. Ficheros fuente de lex y yacc.
9.1. Shell scripts, filtro de impresora y parche para modificar
sendmail.
#!/bin/sh
# $Source: /hpux/shared/supp/usr/src/cmd/lp/model/PCL2,v $
# $Revision: 70.5 $
# Printer Command Language level 2 model
#===========================================================#
# OPTIONS RECOGNIZED: ( all may be preceded by a '-' ) #
# NOTE: Options marked with a '*' before their description #
# are provided for backward compatibility with the #
# former hp2934a printer model. #
# #
# Horizontal Pitch Selection #
# 10 10 cpi (Pica print pitch) #
# 12 12 cpi (Elite print pitch) #
# c compressed print pitch #
# e expanded print pitch #
# fp# set primary font pitch to # cpi #
# sfp# set secondary font pitch to # cpi #
# ( # may be floating point ) #
# ( e.g. 16.66 = compressed ) #
# #
# Vertical Pitch Selection #
# lpi# print at # lines per inch #
# ( default is 6 lpi) #
# #
# Font Selection #
# cs#$ set primary character set to #$ #
# scs#$ set secondary character set to #$ #
# ( see printer reference manual ) #
# ( for possible character sets ) #
# ( e.g. cs8U sets Roman 8 char set ) #
# r8 Roman 8 character set #
# k8 Kana 8 character set #
# i | italic * set font style ti italic #
# b | bold * set font stroke weight to bold #
# #
# Print Quality Selection #
# q | lq * set letter quality and Courier typeface #
# #
# Page Length Selection #
# lnnn set absolute length of page to nnn lines #
# tlnnn set text length of page to nnn lines #
# #
# Margin Selection #
# lm# set left margin in column # #
# rm# set right margin in column # #
# ( left most column = 0 ) #
# #
# Output filtering: (Default Cooked) #
# r | raw raw mode for plotting mode etc. #
# nb do not output banner page (to save paper) #
# #
#===========================================================#
PATH="/bin:/usr/bin:/usr/lib"
export PATH
# set up redirection of stderr
log=/usr/spool/lp/log
exec 2>>$log
if [ -z "$LANG" ]
then
LANG="C"
export LANG
fi
# Save the arguments to the model
printer=`basename $0`
reqid=$1
user=$2
title=$3
copies=$4
# Definitions of functions used within this script
do_banner()
{
# Print the standard header
x="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
echo "$x\n$x\n$x\n$x\n"
banner `echo $user`
echo "\n"
user=`pwget -n $user | line | cut -d: -f5`
if [ -n "$user" ]
then
echo "User: $user\n"
else
echo "\n"
fi
echo "Request id: $reqid Printer: `basename $0`\n"
date
echo "\n"
if [ -n "$title" ]
then
banner "$title"
fi
echo "\f\r\c"
}
# Set up interface
if [ -t 1 ]
then
stty 9600 opost onlcr -parenb cs8 ixon -istrip clocal tab3 <&1 2>/dev/null
else
slp -n -k 2>/dev/null
fi
# Handle disable and cancel traps.
trap "echo 'Terminated: $reqid' >> $log; trap 15; kill -15 0; exit 0 " 15
# Set up printer default modes
##echo "\033E\r\c" # Reset Printer, evita que salga una hoja al principio.
echo "\033&k2G\r\c" # Set line termination mode.
# Determine which options have been invoked
pitch="def"
spitch="def"
lpi="def"
charset="def"
scharset="def"
pagelen="def"
tpagelen="def"
lmargin="def"
rmargin="def"
outputmode="cooked"
banner="yes"
style="def"
weight="def"
quality="def"
for i in $5
do
case "$i" in
-10 | 10) # primary font pitch set to 10.00 cpi
pitch="10";;
-12 | 12) # primary font pitch set to 12.00 cpi
pitch="12";;
-c | c) # primary font pitch set to compressed print
pitch="c";;
-e | e) # primary font pitch set to expanded print
pitch="e";;
# set primary font pitch to value following fp
-fp[0-9]* | fp[0-9]* | -fp.[0-9]* | fp.[0-9]*)
pitch="`echo "$i" | sed 's/^[-]*fp//'`";;
# set secondary font pitch to value following sfp
-sfp[0-9]* | sfp[0-9]* | -sfp.[0-9]* | sfp.[0-9]*)
spitch="`echo "$i" | sed 's/^[-]*sfp//'`";;
# set lines per inch to value following lpi
-lpi[0-9]* | lpi[0-9]*)
lpi="`echo "$i" | sed 's/^[-]*lpi//'`";;
# set primary character set to value following cs
-cs[0-9]* | cs[0-9]*)
charset="`echo "$i" | sed 's/^[-]*cs//'`";;
# set secondary character set to value following scs
-scs[0-9]* | scs[0-9]*)
scharset="`echo "$i" | sed 's/^[-]*scs//'`";;
-r8 | r8) # primary character set is Roman8
charset="8U";;
-k8 | k8) # primary character set is Kana8
charset="8K";;
#set absolute length of page to the value following l
l[0-9]* | -l[0-9]*)
pagelen="`echo "$i" | sed 's/^[-]*l//'`";;
#set text length of page to the value following tl
tl[0-9]* | -tl[0-9]*)
tpagelen="`echo "$i" | sed 's/^[-]*tl//'`";;
# set right margin in column given by value after lm
lm[0-9]*| -lm[0-9]*)
lmargin="`echo "$i" | sed 's/^[-]*lm//'`";;
# set left margin in column given by value after lm
rm[0-9]* | -rm[0-9]*)
rmargin="`echo "$i" | sed 's/^[-]*rm//'`";;
r | -r | raw | -raw) # raw mode for binary output to printer
outputmode="raw";;
nb | -nb) # Do not output banner page
banner="";;
# The following three options are provided for backward compatability
# with the former hp2934a model
i | -i | italic | -italic) # set italic font style
style="italic";;
b | -b | bold | -bold) # set font stroke weight to bold
weight=1;;
q | -q | lq | -lq) # letter quality and Courier typeface
quality="letter";;
esac
done
# Assume that the rest of the arguments are files
shift; shift; shift; shift; shift
files="$*"
# print the banner if no banner not specified
if [ -n "$banner" ]
then
do_banner
##echo "\033E\r\c" # Reset Printer
echo "\033&k2G\r\c" # Set line termination mode.
fi
# Print the spooled files
i=1
while [ $i -le $copies ]
do
for file in $files
do
# If raw mode turn off output processing
if [ "$outputmode" = "raw" ]
then
if [ -t 1 ]
then
stty raw 9600 -parenb cs8 ixon -istrip clocal tab0 <&1
2>/dev/null
else
slp -r 2>/dev/null
fi
echo "\033&k0G\r\c" # Reset line termination mode
fi
case "$pitch" in
def);;
c) echo "\033&k2S\r\c";;
e) echo "\033&k1S\r\c";;
*) echo "\033(s${pitch}H\r\c";;
esac
case "$spitch" in
def);;
*) echo "\033)s${spitch}H\r\c";;
esac
case "$lpi" in
def);;
*) echo "\033&l${lpi}D\r\c";;
esac
case "$charset" in
def);;
*) echo "\033(${charset}\r\c";;
esac
case "$scharset" in
def);;
*) echo "\033)${scharset}\r\c";;
esac
case "$pagelen" in
def) ;;
*) echo "\033&l${pagelen}P\r\c";;
esac
case "$tpagelen" in
def);;
*) echo "\033&l${tpagelen}F\r\c"
echo "\033&l1L\r\c" #Habilita modo skip
;;
esac
case "$lmargin" in
def);;
*) echo "\033&a${lmargin}L\r\c";;
esac
case "$rmargin" in
def);;
*) echo "\033&a${rmargin}M\r\c";;
esac
case "$style" in
def);;
italic) echo "\033(s1S\033)s1S\r\c";;
esac
case "$weight" in
def);;
*) echo "\033(s${weight}B\033)s${weight}B\r\c";;
esac
case "$quality" in
def);;
letter) echo "\033(s2q3T\033)s2q3T\r\c";;
esac
cat $file 2>/tmp/sh$$
if [ -s /tmp/sh$$ ]
then
cat /tmp/sh$$ # output any error messages
fi
rm /tmp/sh$$
echo "\033E\r\c" # Reset Printer
done
i=`expr $i + 1`
done
# Insure all buffers are flushed to printer
if [ -t 1 ]
then
stty 9600 opost onlcr -parenb cs8 ixon -istrip clocal tab3 <&1 2>/dev/null
fi
exit 0
#!/bin/ksh
# @(#) $Revision: 93/08/09 $
# Revision history: 92/10/14: added 9.0 comments
# 93/02/22: Added support for mixed clusters.
# Added support for invocation as decustomize
# (backs out files and libraries).
# 93/03/08: Fixed a defect on S300 clusters, gave error.
# 93/08/09: Added warning about "busy" files.
#
#########################################################
#
# This boiler plate section of the customize/decustomize script is
# used for defining the operating parameters of the patch to be
# installed.
#
# NOTE: This script cannot be used to patch files that are host-specific CDF's,
# because these are usually user-configurable.
#
# These consist of the patch name with the syntax as specified including the
# underscore character. The syntax is very important:
#
# PHxx_zzzz where xx = area of HP-UX to be patched
# {
# CO = commands,
# KL = kernel
# NE = networking
# SS = All HP-UX Sub-Systems (ie, X11, Starbase, OpenMail)
# }
#
# zzzz = patch serial number as assigned by sending mailing to hpfcme,
# <wsyinfo@hpfcme>. Leading zeroes are required.
#
#
# Patch placement data:
#
# This will be an entry or series of entries with the following elements.
# There will be either five or six parameters depending on if the item to
# be patched is an object file to be replace and existing element of an
# archive library file.
#
# All the parameters are enclosed in quotes and separated by a space.
# They need to be specified in the following order:
#
# Position Parameter Description
# -------- ----------- -------------------------------------------
# 1 Object file The actual patched piece of patched code.
#
# 2 Object The full path location down to the directory
# Location level for the patched code.
#
# 3 Affected If item 1 is a .o file for inclusion in an
# Library existing library, then the name of the
# library is specified as the third parameter.
#
# 3/4 User name User ownership of the file. Should use
# "root" as the default.
#
# 4/5 Group name Group ownership of the file. Should use
# "other" as the default.
#
# 5/6 Permissions What are the file permissions (numeric) of
# the target file. Use 0555 for executables
# and 0444 for libraries and other files as
# the defaults.
#
# Some sample entries:
#
# Patch[1]="lp /usr/bin root bin 4555"
#
# Patch[2]="dil_hpib.o /etc/conf libmin.a root other 0444"
#
# Patch[3]="X /usr/bin/X11 bin sys 2555"
#
# There should be one entry per item to be patched as the examples indicate
# in this case.
#
# PATCH_COUNT Modify the total number of pieces in this patch by editing
# the PATCH_COUNT which defaults to one (1).
#
# HARDWARE Destination or target system hardware type is then specified
# as 300, 700, or 800. This is to provide some installation
# consistency checking. Note that for purposes of operating
# systems that the 400 is the same as the 300.
#
# TARGET_OS Specifies the target revisions of the operating system that
# this patch will support. List all that apply. Note that
# all values should be separated with a space.
# Examples:
# o A series 300 patch might have the following string:
# "7.0 7.03 7.05".
# o A series 800 systems OS strings might look like:
# "8.0 8.02 8.06".
# o As indicated you may use 8.02 instead of A.08.02,
# however either form will work.
# o Please use 9.0 for 9.0 and not A.09.00. This will
# be consistant with the validate script.
#
##########################################################
#
# USER supplied global patch parameters
#
PATCH_NAME="PHNE_3996" # CHANGE THIS LINE
Patch[1]="sendmail /usr/lib root root 05555"
#Patch[_P2_]="patch2"
#Patch[_P3_]="patch3"
#Patch[_P4_]="patch4"
#Patch[_P5_]="patch5"
#Patch[_P6_]="patch6"
#Patch[_P7_]="patch7"
#Patch[_P8_]="patch8"
#Patch[_P9_]="patch9"
#Patch[_P10_]="patch10"
#Patch[_P11_]="patch11"
#Patch[_P12_]="patch12"
#Patch[_P13_]="patch13"
#Patch[_P14_]="patch14"
#Patch[_P15_]="patch15"
#Patch[_P16_]="patch16"
#Patch[_P17_]="patch17"
#Patch[_P18_]="patch18"
PATCH_COUNT=1 # CHANGE THIS LINE
HARDWARE=300 # CHANGE THIS LINE (300 or 800)
typeset -u TARGET_OS="A.09.00 A.B9.00 B.09.00"
#
# USER modifiable routines.
# These routines are called:
# 1. Mod_Object -- is used as needed to modify an individual patch
# object or to provide special handling, such as
# creating a link. It is called for each patch
# object. You should be aware that when called:
#
# $NEW = the path to the new patch object,
# $Object = the patched object itself,
# $E_Object = the CDF-expanded patched object itself,
# $Path = the destination path for the patched
# object.
#
# 2. First_Actions - is used as the name implies to implement any
# actions which need to be taken PRIOR to the
# patches being installed, ie., shutting down
# a specific process.
#
# 3. Last_Actions -- is used as the name implies to implement any
# last special operations which may be required
# for this patch. At the time it is called,
# all patch objects and/or libraries have been
# installed or modified. This could be used
# to restart a daemon or other such operations.
#
# NOTE: It should NOT be used to reboot the
# system or rebuild the kernel. Those
# functions should be left to the update
# process.
#
# NOTE: Neither routine should exit the script except in case of
# HARD errors. If that is the case then follow the format
# of the ERROR echo commands found in this script to report
# errors prior to exiting.
#
Mod_Object()
{
return
}
S_executing=0
Sendmail_existed=0
permo=""
permg=""
permu=""
First_Actions()
{
# set -x # Debugging only
# Kill off the old sendmail daemon
Not_S_executing=`ps -ef | grep sendmail | grep -c "\-bd"`
let S_executing=!$Not_S_executing
if [ $S_executing -eq 0 ]; then
/usr/lib/sendmail -bk
fi
# Determine current permissions so they can be restored later
if [ -f /usr/lib/sendmail ]; then
Sendmail_existed=1
Object=sendmail
Path=`Expand_Cdf /usr/lib`
if [ -H $Path/${Object} -a -s $Path/${Object}+/$SPU ]
then
E_Object="${Object}+/$SPU"
else
E_Object="$Object"
fi
Permissions=`/bin/ls -l $Path/$E_Object`
let i=1
perm=""
while [ $i -le 10 ]
do
next_char=`/bin/expr substr "$Permissions" $i 1`
if [ $next_char != '-' ]; then
perm=${perm}${next_char}
fi
if [ $i = 4 ]; then
permu=$perm
if [ $next_char = "s" ]; then
permu=$permu'x'
fi
perm=""
fi
if [ $i = 7 ]; then
permg=$perm
if [ $next_char = "s" ]; then
permg=$permg'x'
fi
perm=""
fi
if [ $i = 10 ]; then
permo=$perm
if [ $next_char = "s" -o $next_char = "t" ]; then
permo=$permo'x'
perm=""
fi
fi
let i=i+1
done
fi
return
}
Last_Actions()
{
# set -x # Debugging only
# Restore file permissions if they existed before this
if [ $Sendmail_existed -eq 1 ]; then
/bin/chmod 0 $Path/$E_Object # To override a chmod bug
/bin/chmod u=$permu $Path/$E_Object
/bin/chmod g=$permg $Path/$E_Object
/bin/chmod o=$permo $Path/$E_Object
fi
# Restart the new sendmail daemon
if [ $S_executing -eq 0 ]; then
/usr/lib/sendmail -bd -q30m
fi
return
}
#
# Error routine for attempted mixed cluster installation
#
MixedInstallError()
{
echo "ERROR: This custer server does not appear to serve"
echo " series $HARDWARE systems. The patch \"$PATCH_NAME\""
echo " cannot be installed."
exit 1
}
#
# Error routine for hardware testing
#
HardwareInstallError()
{
echo "ERROR: Cannot proceed with $SCRIPT script. Cannot verify"
echo " that the hardware matches the target system type of"
echo " series $HARDWARE. Check to be sure that the file,"
echo " \"/bin/hp9000s$HARDWARE\" is present and is executable."
echo " Also be sure that you are logged into a series $HARDWARE"
echo " system (as root). Then execute the command,"
echo " \"$MY_NAME $SPU\"."
exit 1
}
#
# Test for mixed cluster installations
#
Cluster_Tests()
{
MIXED=""
CLUSTER=""
if [ -s /etc/clusterconf ]
then
CLUSTER=Y
if [ -d /system+/$SPU ]
then
MIXED="+/$SPU"
else
if [ -x /bin/hp9000s$HARDWARE ]
then
if /bin/hp9000s$HARDWARE;
then
:
else
MixedInstallError
fi
fi
fi
fi
}
#
# Hardware/opsys checks (Must be run AFTER Cluster_Tests)
#
Check_Hardware()
{
# If a cluster, then checks have been made.
if [ -n "$CLUSTER" ]
then
return
fi
if [ -x /bin/hp9000s$HARDWARE ]
then
if /bin/hp9000s$HARDWARE;
then
continue
else
HardwareInstallError
fi
else
HardwareInstallError
fi
}
#
# Operating system test
#
Check_OPSYS()
{
# If loading 300 bits on a mixed cluster, check the KERN-BLD's rev
# for compatibility instead of uname.
if [ -n "$CLUSTER" -a -n "$MIXED" -a "$SPU" = "HP-MC68020" -a \
-f /system+/HP-MC68020/KERN-BLD/index ]
then
SYSTEM=`awk '/^fv:/ {print $2}' < /system+/HP-MC68020/KERN-BLD/index`
else
SYSTEM=`uname -r`
fi
SYSTEM=${SYSTEM#[AB].?} #Strip all the possibly-changing char's
if (( ${#SYSTEM} == 5 ))
then
SYSTEM=${SYSTEM%?}
fi
SYSTEM=`echo $SYSTEM|awk '{printf("%4.2f",$0)}'`
for SysTEST in $TARGET_OS
do
TARGET=${SysTEST#[AB].?} #Strip all the possibly-changing char's
if (( ${#TARGET} == 5 ))
then
TARGET=${TARGET%?}
fi
TARGET=`echo $TARGET|awk '{printf("%4.2f",$0)}'`
if [ $TARGET = $SYSTEM ]
then
return
fi
done
echo "ERROR: Patch $PATCH_NAME cannot be ${INSTALL}ed on a HP-UX
$SYSTEM."
echo " The patch was designed for one or more of the following"
echo " releases of HP-UX \"$TARGET_OS\"."
exit 1
}
#
# Diskless warning for CDF files
#
# Provide a warning if the object to be replaced is a CDF file. This script
# will not attempt to replace all copies of the file in a cluster due to
# possible problems with such files being modified by the user. For example,
# the X0screens # file in /usr/lib/X11.
#
# If the $Object is an architecture CDF with an element for the $SPU, don't
# give a warning, this script can handle it.
#
If_CDF()
{
if [ -H $1 -a ! -f ${1}+/$SPU ]
then
echo "WARNING: The file \"$Path/$Object\""
echo " is a CDF (Context Dependent File). There are possibly"
echo " unique copies of this file for each diskless node in"
echo " this cluster. Have the system administrator determine"
echo " if additional copies need to be created for each node"
echo " in the cluster. A patched version has been ${INSTALL}ed"
echo " on the node \"$NODENAME\" only."
fi
}
#
# Expand a path-name, substituting all alternate-architecture specific
# ($ALT_SPU) elements with $SPU
#
Expand_Cdf()
{
if [ -z "$CLUSTER" -o -z "$MIXED" ]
then
echo "$1"
else
if [ ! -s "$1" -a ! -f "$1" ]
then
echo "$1"
else
showcdf $1 | sed -e "s%/$ALT_SPU/%/$SPU/%g" \
-e "s%/$ALT_SPU$%/$SPU%g"
fi
fi
}
#
# Install/de-install a patch item
#
Install_Item()
{
NumP=$#
Object=$1
Path=`Expand_Cdf $2`
# If $Object is a CDF, make sure to work with the expanded CDF
# element (E_Object) (assume architecture specific).
if [ -H $Path/${Object} -a -s $Path/${Object}+/$SPU ]
then
E_Object="${Object}+/$SPU"
else
E_Object="$Object"
fi
case $NumP in
# If parameter count equals 5 then install a single object in a directory.
5)
Owner=$3
Group=$4
Permissions=$5
if [ -d $Path ]
then
If_CDF "$Path/$Object"
if [ ! -s $ORIG/$Object ]
then
DIR=`pwd`
if [ "$E_Object" != "$Object" ]
then
cd $Path/${Object}+
Cp_Object="$SPU"
else
cd $Path
Cp_Object="$Object"
fi
if { ls $Cp_Object|cpio -pmu $ORIG > /dev/null 2>&1; }
then
# If cpio copied the $SPU CDF element, move the copy
# to the correct basename under $ORIG
if [ "$Cp_Object" = "$SPU" ]
then
mv $ORIG/$SPU $ORIG/$Object
fi
else
echo "WARNING: Cannot save a backup copy of \"$Object\"."
echo " This process normally creates backup copies of"
echo " the original files (or objects) that are being"
echo " patched. If this is not a brand new file,"
echo " There may be a permissions problem with the"
echo " file/object or the archive directory:"
echo " \"$ORIG\"."
fi
cd $DIR
fi
if { mv $NEW/$Object $Path/$E_Object > /dev/null 2>&1; }
then
continue
else
if [ $already_run = "1" -a ! -s $NEW/$Object ]; then
# We must have already installed this item,
# skip it.
continue
else
echo "ERROR: Cannot ${INSTALL} the patched copy of \"$Object\"."
echo " This may be due to disk space limitations,"
echo " the target file may be \"busy\" (already in"
echo " use), or a permissions problem."
exit 1
fi
fi
chown $Owner $Path/$E_Object
chgrp $Group $Path/$E_Object
chmod $Permissions $Path/$E_Object
Mod_Object
else
echo "NOTE: The directory in \"$Path\""
echo " does not exist. You may not have this subsystem"
echo " installed. The \"$NEW/$Object\""
echo " patch has not been ${INSTALL}ed on this system."
fi
break ;;
# If parameter count equals 6 then install an object into an library file.
6)
Library=`Expand_Cdf $3`
Owner=$4
Group=$5
Permissions=$6
if [ -d $Path ]
then
if [ ! -x /bin/ar ]
then
echo "ERROR: Cannot execute /bin/ar to update library $Path/$Library."
echo " You will need to determine the reason for this problem."
echo " Then while logged as as the root user, manually execute"
echo " the command\"$MY_NAME $SPU\"."
exit 1
fi
If_CDF "$Path/$Library"
Pwd=`pwd`
cd $ORIG # Save copy of original object
if [ ! -s $Object ]
then
if { ar -x $Path/$Library $Object > /dev/null 2>&1; }
then
continue
else
echo "WARNING: Cannot save a backup copy of \"$Object\"."
echo " This process normally creates backup copies of"
echo " the original files (or objects) that are being"
echo " patched. If this is not a brand new file,"
echo " There may be a permissions problem with the"
echo " file/object or the archive directory:"
echo " \"$ORIG\"."
fi
fi
cd $NEW # Then install new object module
if { ar -r $Path/$Library $Object > /dev/null 2>&1; }
then
# Clean up.
rm $Object
else
echo "ERROR: Cannot ${INSTALL} the copy of \"$Object\""
echo " in the library:"
echo " \"$Path/$Library\"."
echo " This may be due to disk space limitations,"
echo " the target file may be \"busy\" (already in"
echo " use), or a permissions problem."
exit 1
fi
chown $Owner $Path/$Library
chgrp $Group $Path/$Library
chmod $Permissions $Path/$Library
cd $Pwd
else
echo "NOTE: The directory in \"$Path\""
echo " does not exist. You may not have this subsystem"
echo " installed. The library \"$Path/$Library\""
echo " patch has not been updated on this system."
fi
break ;;
# If the parameter count is not 5 or 6 then there is a fatal error in this
# script in the indicated Patch_Item.
*)
echo "ERROR: Patch Item $count has the incorrect number of"
echo " parameters. This would indicate that this patch is"
echo " defective. Contact a Hewlett-Packard representative"
echo " for assistance."
exit 1
;;
esac
}
#################################################################
#
# ACTUAL START OF SCRIPT
#
#################################################################
#################################################################
#
# Update supplied parameter (architecture). This value is normally
# passed in by the update command. If this script is executed manually
# Then this must be passed in by the user.
if [ -z "$1" -o \( "$1" != "HP-PA" -a "$1" != "HP-MC68020" \) ]
then
echo "ERROR: $0 expects an argument of \"HP-MC68020\" or \"HP-PA\"."
echo " Use \"HP-MC68020\" for all Series 300 and 400 systems."
echo " Use \"HP-PA\" for all Series 700 and 800 systems."
exit 1
else
SPU=$1
fi
if [ "$SPU" = "HP-PA" ]
then
ALT_SPU="HP-MC68020"
else
ALT_SPU="HP-PA"
fi
#
# Must logged in as root user (in case of manual operation).
#
if [ `id -u` = "0" ]
then
continue
else
echo "ERROR: Must be superuser (root) to execute this script."
exit 1
fi
cd /
#
##########################################################
PATH=/bin:/etc:/usr/bin
export PATH
SCRIPT=`basename $0`
if [ "$SCRIPT" = "decustomize" ]
then
INSTALL="de-install"
else
INSTALL="install"
fi
# Setup and test for hardware/diskless cluster problems.
Cluster_Tests
Check_Hardware
Check_OPSYS
SYS_DIR=`Expand_Cdf /system`
ORIG="$SYS_DIR/$PATCH_NAME/orig"
NEW="$SYS_DIR/$PATCH_NAME/new"
NODENAME=`hostname`
#
# If this script is called "decustomize", then backout the patch with
# what was stored in $ORIG.
#
MY_NAME=$0
if [ "$SCRIPT" = "decustomize" ]
then
if [ "$2" = "check" ]
then
exit 0
else
TOR="$ORIG"
ORIG="$NEW"
NEW="$TOR"
fi
fi
#
# Insure that the original files/objects can be archived correctly
#
if [ ! -d $ORIG ]
then
if { mkdir $ORIG > /dev/null 2>&1; }
then
chmod 755 $ORIG
else
echo "ERROR: Cannot create the backup directory,"
echo " \"$ORIG\"."
exit 1
fi
already_run=0
else
echo "WARNING: \"$MY_NAME\" has"
echo " already been executed once already."
echo " Backup copies will only be saved if they have"
echo " not been saved before."
already_run=1
fi
# Initiate First steps if any.
First_Actions
# Now install the patched code.
integer count=1
while (( count <= $PATCH_COUNT ))
do
Install_Item ${Patch[count]}
(( count = count + 1 ))
done
# Do any cleanup actions required.
Last_Actions
rmdir $NEW;
if [ -d $NEW ]
then
echo "NOTE: Did not ${INSTALL} all files from $NEW."
fi
echo "NOTE: $PATCH_NAME has been successfully ${INSTALL}ed."
echo " Backup copies of original files/objects have been"
echo " saved in \"$ORIG\"."
exit 0
9.2. Programa en C para simular el lanzamiento de un dado.
main()
{
int n[5],i,j,a ;
#define ESCALA 2
#define TOTAL 500
for (i=0;i<6;i++) n[i]=0 ;
printf("\033[2J") ;
for (i=1;i<TOTAL;i++)
{
cursor(5,35) ; printf("%5d",i) ;
a=rand()%6 ; ++n[a] ;
cursor(10+2*a,1) ;
printf("%4.1f%% ",(float)n[a]*100/TOTAL) ;
if (n[a]%ESCALA==0)
printf("\033[7m%*c\033[m",n[a]/ESCALA,' ') ;
}
cursor(23,1) ;
}
cursor(a,b)
int a,b ;
{
printf("\033[%d;%dH",abs(a),abs(b) ) ;
}
9.3. Programa en C con una sesin debugger grabada.
#include <stdio.h>
#define YEAR_PROMPT \
"\nEnter the first year on which to report: "
#define NUM_YEARS_PROMPT \
"\nEnter the # of years to consider (1 - 5): "
typedef int year_type;
typedef int num_years_type;
typedef double month_total_type;
typedef month_total_type array_type[60];
num_years_type num_years;
year_type first_year;
int year_index;
int num_of_months;
array_type month_table;
FILE *rain_fall,
*fopen();
void get_first_year()
{
printf (YEAR_PROMPT);
scanf ("%d", &first_year);
if ((first_year < 1950) || (first_year > 1988))
get_first_year();
}
void get_num_years()
{
printf (NUM_YEARS_PROMPT);
scanf ("%d", &num_years);
if ((num_years < 1) || (num_years > 5))
get_num_years();
}
void get_input()
{
/*
* This function prompts the user for the initial year and number of
* years for the report. It also checks to see that the year and number
* of years are within range.
*/
get_first_year();
get_num_years();
year_index = (first_year - 1950) * 12;
num_of_months = num_years * 122;
}
void load_month_table()
{
int array_index;
int hold_rain_fall = 0;
rain_fall = fopen("/usr/lib/xdb_demos/RAINFALL", "r");
/* This loop will perform dummy reads to get the file to the start
* of the requested data.
*/
for (array_index = 1; array_index <= year_index; array_index++)
fscanf (rain_fall, "%d", &hold_rain_fall);
for (array_index = 1; array_index <= num_of_months; array_index++) {
fscanf (rain_fall, "%d", &hold_rain_fall);
month_table[array_index] = hold_rain_fall / 100;
}
}
main()
{
get_input();
load_month_table();
}
/* @(#) A.08.00 HP-UX SYMBOLIC DEBUGGER / DEMOS $Revision: 1.4 $ */
# Enter a 5 and press return.
# Welcome! To help you read the rest of the
# welcome message, I'm going to make
# the source window smaller. To make the source window (the highest
# window on your screen) a different size, use the w (window) command.
# Enter a carriage return at the end of both this line and the next.
w 3
# Enter an 18 and press return.
# Welcome to the HP C version of the sample HP Symbolic Debugger session.
# In this session, you will see
# some of the commands that HP Symbolic Debugger
# has to aid you in debugging your HP C programs.
# Remember, this is not
# meant to be a comprehensive tutorial of all the HP Symbolic Debugger
# commands; just an introduction to the use of the debugger and a
# chance to see how some of the commands work.
#
# The first part of this session will demonstrate some of the commands
# you can use to help you navigate through the program.
# Then, we'll start the program and actually find a bug.
#
# At the top of your screen in the source window, you can see the source of
# the sample program. In the highlighted window (the location window)
# you can see the file, procedure, and line number
# with which you are currently working.
# Enter a 15 and press return.
# In this window (the command window), you can see
# the commands that are executed. The lines that begin with a
# pound sign (#) are comments. The debugger commands appear
# on lines that do not begin with the pound sign.
# After every command is issued, you
# are given a choice of commands to execute in order to actually
# execute the debugger commands.
# You will enter either a carriage return or a number to execute
# the debugger commands. When you see a number inside
# greater than and less than signs (<>), enter the number
# followed by a carriage return. Whichever number you enter will
# cause that number of lines to be executed. If you accidentally
# enter the wrong number or get off track, just press carriage return
# <cr> until you see the next instruction (number).
# <12>
# When you see a "cr" inside greater than and less than signs (<>),
# enter a carriage return after the number of lines indicated.
# Then look in the command window to
# see which command is executing and its output. Watch the source
# and location windows to see what happens to them when the command
# executes.
# You can quit the debugger session at any time by entering <Q>.
#
# You will also be required to type in input to the program.
# This works the same; the input you need to enter will appear
# inside greater than and less than signs. Time to begin.
# <3>
# You've already seen the w (window) command work. Let's use it
# again to make the source window larger.
# <2>
w 10
# <4>
# That's better. Speaking of windows, if you wanted to see the
# assembly code for your program instead of the source code,
# you could do it with the td (toggle disassembly) command.
# <2>
td
# <3>
# If you want to look at the source and assembly code, use the
# ts (toggle screen) command.
# <2>
ts
# <2>
# For purposes of this session, let's just look at the source code.
# <2>
td
# <2>
ts
# <4>
# I used the td command to get back to the assembly code and then
# used the ts command to get back the all-source window.
# In source mode, you can look at the source by using the v (view) command.
# <2>
v 1
# <2>
# If you want to move forward in the file, use the + command.
# <2>
+ 15
# <2>
# If you want to move backward in the file, use the - command.
# <2>
- 7
# <2>
# You can look forward in the current file for any text string by using the / command.
# <2>
/ year_index
# <2>
# You can also look for a text string by going backwards with the ? command.
# <2>
? get_num_years
# <5>
# Did you notice that it looked backwards past the beginning of the file and
# looped back around the end of the file to find "get_num_years"? Both the
# / and the ? will search past the end or beginning of the file.
# Suppose you now want to see the next occurrence of that same text string.
# <2>
n
# <4>
# Notice we were still going backwards. The n (next) command continues searching
# in the same direction. Let's say we want to see the next occurrence of
# that same text string but want to go forward in the file.
# <2>
N
# <3>
# The N (Next) command does that for us. Now, do you remember how to
# view the first line of the file?
# <2>
v 1
# <3>
# Great! Now, we're going to start the program (called the child process).
# We're going to single step through the program with the s (step) command.
# <2>
s
# <4>
# The first s (step) command starts the child process.
# Once the child process is started, each succeeding s (step) command
# executes one program statement (or step).
# <2>
s
# <2>
# Let's do one more.
# <2>
s
# <3>
# Good. Now we can look at a variable's initialized value before executing
# the program.
# <2>
p first_year
# <2>
# Looks good! Now let's set a breakpoint at line 25 and run the program.
# <2>
b 25
# <5>
# Notice the asterisk beside line 25. This tells you that you have a breakpoint
# set there. Now, let's continue program execution using the
# c (continue) command.
# Enter the year <1952> when you're prompted for it.
# <2>
c
# <4>
# We reached the breakpoint at line 25. At this point
# we can perform a stack trace to see the
# sequence of subroutine calls by which we reached this point.
# <2>
t
# <6<>
# The subroutine we are currently in (get_first_year)
# is on the stack at depth 0.
# The "get_input" subroutine called "get_first_year" and the main
# program called "get_input".
# Now, let's print out the first_year variable to see what's in there.
# <2>
p first_year
# <4>
# You can print out variables in various formats. To see the same
# variable in hexadecimal, use the p (print) command with the
# \x option.
# <2>
p first_year\x
# <2>
# Or to see it in octal:
# <2>
p first_year\o
# <3>
# You can print out the value of the same variable as before by using a
# period with the p (print) command.
# <2>
p.
# <2>
# You can also print the same variable in a different format:
# <2>
p.\x
# <3>
# You can also modify the same variable. Let's change the first_year
# variable's value to "1953" instead of "1952".
# <3>
p. =1953
# Alternatively, you can modify the same variable by using its name.
# <2>
p first_year=1951
# <3>
# Great! Now, we need to find out which subroutine gets the data into
# the month_table array. We can find out by listing the procedures.
# <2>
lp
# <2>
# The procedure we need is load_month_table. Let's set a breakpoint there.
# <2>
b load_month_table
# <3>
# Now, let's continue program execution.
# Enter the number <2> when you are prompted for the number of years.
# <2>
c
# <3>
# Now we've reached the breakpoint.
# Let's remove all the breakpoints before we inspect the loops.
# <2>
db *
# <4>
# The asterisk is used when you want to clear all the breakpoints.
# The loops we want to inspect are in this subroutine, so we'll
# single step down to the first one.
# Enter a carriage return <cr> after this and each of the next three lines.
s
s
s
# <2>
# The important parameter is the year_index. Let's examine it.
# <2>
p year_index
# <7>
# It seems rational.
# Let's set up a breakpoint to print out the progress of the loop.
# The only variables in which we are interested are "array_index"
# and "hold_rain_fall". Both happen to be
# locals to this procedure, so wecan use the l (list) command to
# display them
# <2>
b 62 {Q; l; if(array_index <= 6) {c} }
# <2>
# Now, we'll continue executing the program.
c
# <2>
# Now, let's check the parameter for this loop.
# <2>
p num_of_months
# <2>
# Wow! There are too many months! Where did this get set?
# <2>
? num_of_months
# <6>
# We just used the ? command to search backward in the file
# for num_of_months. Looking at it, we can see the problem.
# "num_years" is being multiplied by 122 instead of 12.
# So, let's print out the value of "num_years" and store that
# number multiplied times 12 (the correct number of months).
# <2>
p 12*num_years
# <2>
p num_of_months=12
# <2>
# Now that we've fixed the bug, let's see if the program runs correctly.
# <3>
# Let's continue execution.
# but first, lets remove the breakpoint
# <2>
db *
# <2>
# Now, we can continue the program execution.
# <2>
c
# <3>
# Hurrah! It works!
# Now, we can go back and change our source code and recompile.
# <3>
# This is the end of the debugger session. Now, go back to the
# User's Guide and continue with Chapter 3.
# @(#) A.08.00 HP-UX SYMBOLIC DEBUGGER / DEMOS $Revision: 1.4 $
9.4. Makefiles de instalacin del editor asedit y traductor de
Pascal a C (pc2).
#
# Makefile.raw for asedit Release 1.3
# (C) A. Stochniol, 1993 - 1994
# 16 May 1994
#
# You should use that file ONLY when you can't use xmkmf (or imake) !
#
#
# -----------------
# *** 1. SELECT ***
#
# which Motif, Xt Toolkit and X library are you using ?
# Usually you do NOT change the 3 definitions that follows unless you use
# extra shared libraries (in which case you would probably use "-lXm_s -lPW",
# "-lXt_s", "-lX11_s" respectively).
# Note that on some systems you might not need PW library at all (see below).
#
# If you use libraries located in non-standard tree you might define
# my LOCAL_X_LIBDIR variable instead of specifiying the full pathname for
# each library (see the SUN example).
#
LOCAL_X_LIBDIR =
##XMLIB = -lXm -lPW
XTOOLLIB = -lXt
XLIB = -lX11
XMLIB = -lc
# Note about libPW.a: it is the Programmers Workbench library, which is
# an ATT product not included in Berkeley systems. Hence it is not found
# in SunOS or Ultrix. The library is needed because of regex(3) routines
# i.e. regcmp & regex, for systems that do not have them in the libc.a.
# If you don't have libPW.a (SunOS, Ultrix) simply don't specify "-lPW".
# Note about PW library on HP:
# there are some name conflicts between PW and c libraries; to prevent
# unexpected results due to these name conflicts always search
# libc *before* searching libPW (i.e. link using a following sequence
# -lc -lPW)
#
#
# On some systems the libaries and include files might be located
# in quite strange places. Below there are lines that I've used to install
# asedit on different systems around my place (you might find it helpful).
#
# DEC settings (to use uncomment the lines below)
# XMLIB = /usr/lib/DXM/lib/Xm/libXm.a
# XTOOLLIB = /usr/lib/DXM/lib/Xt/libXt.a
# STD_INCLUDES = -I/usr/lib/DXM/lib -I/usr/lib/DXM/lib/Xt
#
# SUN settings (to use uncomment the lines below)
# LOCAL_X_LIBDIR = -L/usr/local/lib
# STD_INCLUDES = -I/usr/local/include
# HP-UX 8.x settings (to use uncomment the lines below)
LOCAL_X_LIBDIR = -L/usr/lib/Motif1.1 -L/usr/lib/X11R4
STD_INCLUDES = -I/usr/include/Motif1.1 -I/usr/include/X11R4 -l/usr/local/include
#
# for SUN with X11R4 and Motif 1.1.4 I had to declare additionally
# Xext and m (mathematical) libraries ...
# XLIB = -lXext -lX11 -lm
# XMULIB library is only needed for X11R4 and X11R5 versions !!
# (for X11R3 the following line that defines XMULIB should be commented
# or defined as an empty string !)
XMULIB = -lXmu
SYS_LIBRARIES = $(LOCAL_X_LIBDIR) $(XMLIB) $(XMULIB) $(XTOOLLIB)
$(XLIB)
# -----------------------------------------------------
# *** 2. DEFINE *** backup file suffix (default: .bak )
# (it might be overriden by the user using asedit backupFileSuffix X resource)
#
Backup_file_suffix = .bak
# ----------------------------------
# *** 3. WHERE *** to install asedit
#
# If you install contributed X applications in their standard place you do
# NOT have to change the default definitions for BINDIR, XAPPLOADDIR,
MANDIR
# and LIBDIR. But if you would like to install asedit somewhere else
# you change the lines that defines those names and explicitly
# define appropriate directories (bear in mind that what is currently written
# are the most often used X-Window defaults obtained after applying standard
# X11 templates, i.e. they might be different on your system).
# BINDIR - defines where the executables are installed
# XAPPLOADDIR - defines where the app defaults files are installed
# MANDIR - defines where the man pages are installed (n-suffix assumed)
# LIBDIR - defines where the help file(s), etc. are installed
#
# Note: for the international Release we redefine XAPPLOADDIR to take
# into account the INST_LANG environment variable! This allow us installing
# multiple language versions with a single Makefile.
# If the INST_LANG is not defined the default appdefs will be taken and they
# will be installed in a standard place (*without* LANG prefix). Set this
# variable when you call Makefile, if necessary.
BINDIR = /usr/bin/X11
XAPPLOADDIR = /usr/lib/X11/${INST_LANG}/app-defaults
MANDIR = /usr/man/mann
LIBDIR = /usr/lib/X11
# The main application defaults file ...
#
AD_FILE = ./${INST_LANG}/Asedit
# -------------------------------------------------------------------
# *** 4. SPECIFY **** where do you want the help file to be installed
# (it might be overriden by the user using asedit helpDir X resource)
#
Help_dir = ${LIBDIR}
#
# --------------------------------------------------------------------
# *** 5. TUNE **** specifically to your system if something goes wrong
#
#
# you might need to increase the String literal space for asedit.c compilation: if
# it is needed (because of the fallbacks), simply uncomment one of the
STRING_INC
# lines below.
# (SGI & DEC) STRING_INC = -Wf,-XNl4096
# (HP-UX ?) STRING_INC = -Wp,-H50000
# If you find that prototypes are not supported on your system
# (non ANSI C, vanilla SUN, etc.) then uncomment the next line
# that defines No_proto_def
#
# No_proto_def = -D_NO_PROTO
#
# If you find that MAXPATHLEN is not defined then uncomment the next line
# No_maxpathlen_def = -DMAXPATHLEN=1024
# Do NOT read this paragraph unless you have buggy Motif 1.1 implementation.
# I have used a focusCallback to set focus to a text widget inside prompt
# dialogs (& inside other dialogs) when the dialog is first managed.
# UNFORTUNATELY this trick corrupts the dialog callback list on ONE computer.
# It is a DEC running X11R4 and Motif 1.1. So I think it might be a bug.
# The corruption happens when you manage a dialog (for example Search/Go to
line..)
# & set a focus to the dialog, next take away the focus & next set a focus
# to the dialog (using for example a pointer). At that stage the program
# blows up ! I've tried different ways to get around that problem and preserve
# setting the focus to the text widget but I've failed. So if you get such
# a problem the only work around is to define XFOCUS_BUG and rebuild asedit
# (but you won't get the text widget focused when you first manage dialogs!
# Define xfocus_bug as -DXFOCUS_BUG below).
# xfocus_bug = -DXFOCUS_BUG
#
## For HP-UX 8.x add in the DEFINES line the following extra element:
## -Aa -D_HP_UX_SOURCE
## For IBM RS/6000 with AIX 3.2.5 you might add extra memory for optimizations
## as in the following line:
## -qmaxmem=4000
DEFINES = $(No_proto_def) $(No_maxpathlen_def) $(xfocus_bug)
#
# END of customisation part of the Makefile
#
SRCS = asedit.c as_menuh.c file_rw.c clipbrd.c \
write_l.c find_pos.c asutil.c undo.c ht_help.c mk_asdat.c\
file_dlg.c file_act.c srch_dlg.c srch_act.c editarea.c\
calc_lc.c exec_cmd.c tool_dlg.c
OBJS = asedit.o as_menuh.o file_rw.o clipbrd.o \
write_l.o find_pos.o asutil.o undo.o ht_help.o mk_asdat.o\
file_dlg.o file_act.o srch_dlg.o srch_act.o editarea.o\
calc_lc.o exec_cmd.o tool_dlg.o
# asedit dependencies .....
asedit.o : asedit.h clipbrd.h machine.h xresrc.h asedit.ico Asedit.ad.h
as_menuh.o: asedit.h
asutil.o: asedit.h asedit.ico
editarea.o: asedit.h
file_act.o: asedit.h
file_dlg.o: asedit.h
file_rw.o: asedit.h
ht_help.o: asedit.h
mk_asdat.o: asedit.h
srch_act.o: asedit.h
srch_dlg.o: asedit.h
undo.o: asedit.h
calc_lc.o: asedit.h
exec_cmd.o: asedit.h
tool_dlg.o: asedit.h
clipbrd.o : clipbrd.h
#
# A rule to convert the X resource file into C declarations,
# appropriate for inclusion as fallback resources.
# The following rule ensures that asedit always has the latest version of its
# resources compiled into the executable.
#
# Note: SUN's make doesn't like extended AD_FILE definition with INST_LANG
# (so we replace the following Asedit.ad.h dependence with a simpler one
# in the free release; you might restore the original if you want)
#
# (orig. see above) Asedit.ad.h: ${AD_FILE}.ad Makefile
Asedit.ad.h: Makefile
./ad2c.scr ${AD_FILE}.ad > Asedit.ad.h
# Definition of some standard programs and flags
RM = rm -f
CC = cc
INSTALL = /usr/ucb/install
CFLAGS = $(DEFINES) ${STD_INCLUDES}
.c.o:
$(RM) $@
$(CC) -c $(CFLAGS) $*.c
asedit.o: Makefile
$(RM) $@
$(CC) -c $(CFLAGS) ${STRING_INC} $*.c
ht_help.o: Makefile
$(RM) $@
$(CC) -c $(CFLAGS) -DHELPDIR=\"${Help_dir}\" $*.c
file_rw.o: Makefile
$(RM) $@
$(CC) -c $(CFLAGS) -DBACKUP_FILE_SUFFIX=\"${Backup_file_suffix}\"
$*.c
PROGRAM = asedit
all:: asedit
asedit: $(OBJS)
$(RM) $@
$(CC) -o $@ $(OBJS) $(SYS_LIBRARIES)
install:: asedit
$(INSTALL) -m 0755 asedit $(BINDIR)
install.man:: asedit.man
$(INSTALL) -c -m 0444 asedit.man $(MANDIR)/asedit.n
clean::
$(RM) $(PROGRAM)
all:: asedit
#
# Install the application default files (version related!)
#
install:: $(AD_FILE).ad
$(INSTALL) -c -m 0444 $(AD_FILE).ad
$(DESTDIR)$(XAPPLOADDIR)/Asedit
$(INSTALL) -c -m 0444 ./${INST_LANG}/Asedit-sgi.ad
$(DESTDIR)$(XAPPLOADDIR)/Asedit-sgi
$(INSTALL) -c -m 0444 ./${INST_LANG}/Asedit_em.ad
$(DESTDIR)$(XAPPLOADDIR)/Asedit_em
$(INSTALL) -c -m 0444 ./${INST_LANG}/Asedit_em-sgi.ad
$(DESTDIR)$(XAPPLOADDIR)/Asedit_em-sgi
# Install the help files
install:: asedit.hlp
$(INSTALL) -c -m 0444 asedit.hlp ${Help_dir}
$(INSTALL) -c -m 0444 asedit_em.hlp ${Help_dir}
# That's it !
# Makefile for "p2c", the Pascal to C translator.
# Copyright (C) 1989 David Gillespie.
# Author's address: daveg@csvax.caltech.edu; 256-80 Caltech/Pasadena CA
91125.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation (any version).
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; see the file COPYING. If not, write to
# the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
# This file compiles and installs p2c in the "home" subdirectory of this
# directory, then runs it on various example programs in the "examples"
# subdirectory. To install a permanent, public copy of p2c, see "README"
# and src/Makefile.
test:
@echo "Compiling p2c, installing in `pwd`/home..."
cd src; make install
@echo ""
@echo "Translating and compiling example files..."
cd examples; make comp
@echo ""
@echo "Running the factorial example..."
examples/fact
@echo ""
@echo "Running the 'e' computation example..."
examples/e
@echo ""
@echo "Running the self-printing Pascal example..."
examples/self >examples/self.out
cat examples/self.out
diff examples/self.p examples/self.out
@echo ""
@echo "Also try 'cref' and 'basic' in the examples directory."
install:
cd src; make install
clean:
cd src; make clean
cd examples; make clean
===============================================================
# Makefile for "p2c", the Pascal to C translator.
# Copyright (C) 1989, 1990, 1991 Free Software Foundation.
# Author: Dave Gillespie.
# Author's address: daveg@csvax.caltech.edu; 256-80 Caltech/Pasadena CA
91125.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation (any version).
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; see the file COPYING. If not, write to
# the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
# Directories (private version)
#HOMEDIR = ../home
#INCDIR = ../home/p2c
#BINDIR = ..
#LIBDIR = ../home
#MANDIR = ../home
#MANFILE = p2c.cat # human-readable manual (for cat.1)
#MANFILE = p2c.man.inst # uncompressed nroff source (for man.1)
#MANFILE = p2c.man.Z # compressed nroff source (for man.1.Z)
# Directories (public version)
HOMEDIR = /usr/local/lib/p2c
INCDIR = /usr/local/include/p2c
BINDIR = /usr/local/bin
LIBDIR = $(HOMEDIR)
MANDIR = /usr/local/man/man1
MANFILE = p2c.man.inst
# Compiler options
CC = cc # you may wish to use gcc here instead
#OPT = # -O # uncomment this for optimization
# HP-UX note - lex.o does *not* compile with any level of optimisation !!
OPT = +O3 +DA1.0 +Obb1000 -I$(INCDIR)/.. # uncomment this for optimization
DEB = # -g # uncomment this for debugging
DEFS = # place other -D types of things here
CFLAGS = $(OPT) $(DEB) $(DEFS)
LFLAGS =
# Custom translator modules
CUSTSRCS = hpmods.c citmods.c
CUSTOBJS = hpmods.o citmods.o
CUSTDEFS = -DCUST1=hpmods -DCUST2=citmods
# File names
P2CSRCS = trans.c stuff.c out.c comment.c lex.c parse.c decl.c \
expr.c pexpr.c funcs.c dir.c
P2COBJS = trans.o stuff.o out.o comment.o lex.o parse.o decl.o \
expr.o pexpr.o funcs.o dir.o
SRCS = $(P2CSRCS) $(CUSTSRCS)
OBJS = $(P2COBJS) $(CUSTOBJS)
LIBSRCS = p2clib.c loc.p2clib.c
LIBOBJS = p2clib.o loc.p2clib.o
OTHERLIBOBJS =
ABSHOMEDIR = $(HOMEDIR)
ABSINCDIR = $(INCDIR)
ABSLIBDIR = $(LIBDIR)
MISCSRCS = makeproto.c
PROTOS = p2c.proto p2c.hdrs
HDRS = trans.h p2c.h
# Top-level targets
all: proto p2c libp2c.a p2c.cat
proto: $(PROTOS)
# Making p2c
p2c: $(OBJS)
$(CC) $(LFLAGS) $(OBJS) -o p2c
dir.o: dir.c trans.h
$(CC) -c $(CFLAGS) $(CUSTDEFS) dir.c
trans.o: trans.c trans.h
$(CC) -c $(CFLAGS) -DHASDUMPS -DP2C_HOME=\"$(ABSHOMEDIR)\"
trans.c
# Making and using makeproto
p2c.hdrs: $(SRCS) makeproto
./makeproto -n -m -h -t16 -a35 -s0 -x $(SRCS) -o p2c.hdrs
p2c.proto: $(SRCS) makeproto
./makeproto -n -m -h -t16 -a35 -s1 -i $(SRCS) -o p2c.proto
makeproto: makeproto.c
$(CC) $(CFLAGS) $(LFLAGS) makeproto.c -o makeproto
# Making the p2c runtime library
libp2c.a: $(LIBOBJS)
ar r libp2c.a $(LIBOBJS) $(OTHERLIBOBJS)
p2clib.o: p2clib.c
$(CC) -c $(CFLAGS) p2clib.c
# Making the p2c man page
p2c.man.inst: p2c.man
sed -e "s;--HOMEDIR--;$(ABSHOMEDIR);" \
-e "s;--INCDIR--;$(ABSINCDIR);" \
-e "s;--LIBDIR--;$(ABSLIBDIR);" \
p2c.man >p2c.man.inst
p2c.man.Z: p2c.man.inst
compress -c p2c.man.inst >p2c.man.Z
p2c.cat: p2c.man.inst
if [ -f /usr/bin/nroff -o -f /bin/nroff ]; \
then nroff -man p2c.man.inst >p2c.cat; fi
# Initially installing p2c:
# First, make sure $(HOMEDIR) and $(INCDIR) exist and are writable;
# Second, make sure $(LIBDIR), $(BINDIR) and $(MANDIR) are writable;
# Third, execute "make install" to compile and set things up.
# (You may need to have a system operator do these steps for you.)
COPY = cp
newhome:
rm -f trans.o # force trans.c to be recompiled (if HOMEDIR changes)
install: proto \
makedirs \
$(BINDIR)/p2c \
$(LIBDIR)/libp2c.a \
$(MANDIR)/p2c.1 \
$(INCDIR)/p2c.h \
$(HOMEDIR)/p2crc \
$(HOMEDIR)/loc.p2crc \
$(HOMEDIR)/system.imp \
$(HOMEDIR)/system.m2 \
$(HOMEDIR)/turbo.imp \
$(HOMEDIR)/string.pas
SHELL=/bin/sh
makedirs:
if [ ! -d $(HOMEDIR) ]; then mkdir $(HOMEDIR); fi
if [ ! -d $(BINDIR) ]; then mkdir $(BINDIR); fi
if [ ! -d $(LIBDIR) ]; then mkdir $(LIBDIR); fi
if [ ! -d $(MANDIR) ]; then mkdir $(MANDIR); fi
if [ ! -d $(INCDIR) ]; then mkdir $(INCDIR); fi
$(BINDIR)/p2c: p2c
$(COPY) p2c $(BINDIR)/p2c
$(LIBDIR)/libp2c.a: libp2c.a
$(COPY) libp2c.a $(LIBDIR)/libp2c.a
if [ -f /usr/bin/ranlib -o -f /bin/ranlib ]; then ranlib $(LIBDIR)/libp2c.a; fi
$(MANDIR)/p2c.1: $(MANFILE)
$(COPY) $(MANFILE) $(MANDIR)/p2c.1
$(INCDIR)/p2c.h: p2c.h
$(COPY) p2c.h $(INCDIR)/p2c.h
$(HOMEDIR)/p2crc: sys.p2crc
$(COPY) sys.p2crc $(HOMEDIR)/p2crc
$(HOMEDIR)/loc.p2crc: loc.p2crc
$(COPY) loc.p2crc $(HOMEDIR)/loc.p2crc
$(HOMEDIR)/system.imp: system.imp
$(COPY) system.imp $(HOMEDIR)/system.imp
$(HOMEDIR)/system.m2: system.m2
$(COPY) system.m2 $(HOMEDIR)/system.m2
$(HOMEDIR)/turbo.imp: turbo.imp
$(COPY) turbo.imp $(HOMEDIR)/turbo.imp
$(HOMEDIR)/string.pas: string.pas
$(COPY) string.pas $(HOMEDIR)/string.pas
# Miscellaneous
tags:
etags $(SRCS) $(LIBSRCS) $(MISCSRCS) $(HDRS)
clean.o:
rm -f $(OBJS)
clean:
rm -f $(OBJS) $(LIBOBJS) $(PROTOS) p2c p2c.man.inst makeproto
wc:
wc $(SRCS) $(LIBSRCS) trans.h
test:
echo '"make test" should be used in the outer-level p2c directory.'
echo 'Type "cd .." and "make test" again.'
===============================================================
# Examples for "p2c", the Pascal to C translator.
# The following definitions assume p2c has been compiled into the "home"
# directory as shown in src/Makefile.
P2C = p2c
INC = /usr/local/include
LIB = /usr/local/lib/p2c/libp2c_s800.a
default: comp
# Translating everything:
trans: fact.c e.c self.c cref.c basic.c
fact.c: fact.p
$(P2C) fact.p
e.c: e.p
$(P2C) e.p
self.c: self.p
$(P2C) self.p
cref.c: cref.p
$(P2C) cref.p
basic.c: basic.p
$(P2C) basic.p
# Compiling everything:
comp: fact e self cref basic
fact: fact.c
$(CC) -I$(INC) fact.c $(LIB) -o fact
e: e.c
$(CC) -I$(INC) e.c $(LIB) -o e
self: self.c
$(CC) -I$(INC) self.c $(LIB) -o self
cref: cref.c
$(CC) -I$(INC) cref.c $(LIB) -o cref
basic: basic.c
$(CC) -I$(INC) basic.c $(LIB) -lm -o basic
clean:
rm -f fact e self cref basic *.o *.c
9.5. Informe generado por gprof sobre la ejecucin del
programa 9.3.
granularity: each sample hit covers 4 byte(s) for 100.00% of
0.02 seconds
flat profile:
%time the percentage of the total running time of the
program used by this function.
cumsecs a running sum of the number of seconds accounted
for by this function and those listed above it.
seconds the number of seconds accounted for by this
function alone. This is the major sort for this
listing.
calls the number of times this function was invoked, if
this function is profiled, else blank.
name the name of the function. This is the minor sort
for this listing.
^L
%time cumsecs seconds calls name
84.7 1.44 1.44 2382 __memchr
8.2 1.58 0.14 2247 __doprnt
2.4 1.62 0.04 2 __write
1.2 1.64 0.02 8909 __memcpy
1.2 1.66 0.02 1998 __abs
1.2 1.68 0.02 499 _cvt
1.2 1.70 0.02 _lowdigit
0.0 1.70 0.00 2247 __printf
0.0 1.70 0.00 2247 __wrtchk
0.0 1.70 0.00 999 _cursor
0.0 1.70 0.00 499 __fcvt
0.0 1.70 0.00 499 __rand
0.0 1.70 0.00 135 __bufsync
0.0 1.70 0.00 135 __fwrite
0.0 1.70 0.00 135 _dowrite
0.0 1.70 0.00 2 __xflsbuf
0.0 1.70 0.00 1 ___findbuf
0.0 1.70 0.00 1 __ioctl
0.0 1.70 0.00 1 __isatty
^L
call graph profile:
The sum of self and descendents is the major sort
for this listing.
function entries:
index the index of the function in the call graph
listing, as an aid to locating it (see below).
9.6. Pgina de manual no formateada y fichero fuente de tbl.
.TH EMACS 1 "1990 November 13"
.UC 4
.SH NAME
emacs \- GNU project Emacs
.SH SYNOPSIS
.B emacs
[
.I command-line switches
] [
.I files ...
]
.br
.SH DESCRIPTION
.I GNU Emacs
is a new version of
.I Emacs,
written by the author of the original (PDP-10)
.I Emacs,
Richard Stallman.
Its user functionality encompasses
everything other
.I Emacs
editors do, and it is easily extensible since its
editing commands are written in Lisp.
.PP
.I Emacs
has an extensive interactive help facility,
but the facility assumes that you know how to manipulate
.I Emacs
windows and buffers.
CTRL-h (backspace
or CTRL-h) enters the Help facility. Help Tutorial (CTRL-h t)
requests an interactive tutorial which can teach beginners the fundamentals
of
.I Emacs
in a few minutes.
Help Apropos (CTRL-h a) helps you
find a command given its functionality, Help Character (CTRL-h c)
describes a given character's effect, and Help Function (CTRL-h f)
describes a given Lisp function specified by name.
.PP
.I Emacs's
Undo can undo several steps of modification to your buffers, so it is
easy to recover from editing mistakes.
.PP
.I GNU Emacs's
many special packages handle mail reading (RMail) and sending (Mail),
outline editing (Outline), compiling (Compile), running subshells
within
.I Emacs
windows (Shell), running a Lisp read-eval-print loop
9.7. Ficheros fuente de lex y yacc.
FUENTE LEX 1
%%
[ \t]+$ ;
[ \t]+ printf(" ");
FUENTE LEX 2
%%
int k;
[0-9]+ {
k = atoi(yytext);
if (k%7 == 0)
printf("%d",k+3);
else
printf("%d",k);
}
FUENTE LEX 3
int lengs[100];
%%
[a-z]+ lengs[yyleng]++;
. |
\n ;
%%
yywrap()
{
int i;
printf("longitud num palabras\n");
for(i=0; i<100; i++)
if (lengs[i] > 0)
printf("%5d%10d\n",i,lengs[i]);
return(1);
}
FUENTE LEX 4
D [0-9]
E [DEde][-+]?{D}+
int i;
%%
{D}+ entero();
{D}+"."{D}*({E})? |
{D}*"."{D}+({E})? |
{D}+{E} real();
%%
entero()
{
i++;
printf("\n el numero encontrado en la posicion %d es entero \n",i);
}
real()
{
i++;
printf("\n el numero encontrado en la posicion %d es real \n",i);
}
FUENTE YACC
%{
#include <stdio.h>
#include <ctype.h>
int regs[26];
int base;
%}
%start list
%token DIGIT LETTER
%left '|'
%left '&'
%left '+' '-'
%left '*' '/' '%'
%left UMINUS
%%
list :
| list stat '\n'
| list error '\n'
{ yyerrok; }
;
stat : expr
{ printf( "%d\n",$1); }
| LETTER '=' expr
{ regs[$1] = $3; }
;
expr : '(' expr ')'
{ $$ = $2; }
| expr '+' expr
{ $$ = $1 + $3; }
| expr '-' expr
{ $$ = $1 - $3; }
| expr '*' expr
{ $$ = $1 * $3; }
| expr '/' expr
{ $$ = $1 / $3; }
| expr '%' expr
{ $$ = $1 % $3; }
| expr '&' expr
{ $$ = $1 & $3; }
| expr '|' expr
{ $$ = $1 | $3; }
| '-' expr %prec UMINUS
{ $$ = - $2; }
| LETTER
{ $$ = regs[$1]; }
| number
;
number : DIGIT
{ $$ = $1; base = ($1==0) ? 8 : 10; }
| number DIGIT
{ $$ = base * $1 + $2; }
;
%%
yylex() {
int c;
while( (c=getchar()) == ' ' ) { /* skip blanks */ }
if( islower( c ) ) {
yylval = c - 'a';
return ( LETTER );
}
if( isdigit( c ) ) {
yylval = c - '0';
return ( DIGIT );
}
return( c ) ;
}

Potrebbero piacerti anche