SISTEMAS OPERATIVOS II
Tercer curso Ingeniería Técnica Informática Sistemas. Curso 2011-2012
Práctica 3: Procesos en Unix: Señales
Continuar la codificación de un intérprete de comandos (shell) en UNIX. Nótese que los comandos
aquí descritos deben interpretarse de la siguiente manera
- Los argumentos entre corchetes [] son opcionales.
- Los argumentos separados por | indican que debe ir uno u otro, pero no ambos
simultaneamente.
- El intérprete de comandos debe aceptar y entender la sintaxis aquí propuesta, pero no tiene
que forzarla. (por ejemplo, si hay varios argumentos deben aceptarse en el orden especificado,
pero puede resultar mas cómodo de programar asumiendo que pueden ir en cualquier orden)
Además deben tenerse en cuenta las siguientes indicaciones
- En ningún caso debe producir un error de ejecución (segmentation, bus error ...).
La práctica que produzca un error en tiempo de ejecución no será puntuada. Excepcionalmente
se admitirá un error en tiempo de ejecución en algunos comandos: en estos casos se indicará explicitamente (***)
- No debe dilapidar memoria (ejemplo: variable que se asigna cada vez que se llama a una función y no se
libera). NO SE REFIERE A DECLARAR LOS ARRAYS DE TAMAÑO PEQUEÑO
- Cuando el shell no pueda ejecutar una acción por algún motivo, debe indicarlo con un
mensaje como el que se obtiene con sys_errlist[errno] o con perror() (por ejemplo,
si no puede cambiar de directorio debe indicar por qué).
- Las direcciones de memoria deben mostrase en hexadecimal.
- La información que se nuestra en pantalla no debe incluir en ningun caso líneas en blanco
(ni líneas de '*' ni de '=',...).
- El shell leerá de su entrada estándar y escribirá en su salida estándar, de manera que
podría ser ejecutado un archivo de comandos invocando al shell con su entrada estándar
redireccionada a dicho archivo.
A efectos de programación de está práctica podemos suponer que hay 32 señales en el sistema. Las funciones disponibles en
http://www.dc.fi.udc.es/~afyanez/Practicas/sources/senales.c
permiten convertir de nombre de señal a númeor de señal y viceversa
Comandos a implementar en esta práctica
- senal
- [-dfl|-ign|man] [-l] [-r] [-resethand] [-onstack] [-nodefer] [-restart] [-sNN] [-mSEN1] [-mSEN2] ...S1 S2...
- maxreenvios
- [N] Establece el valor de maxReenvios (definido en el apartado anterior): el número máximo de veces que un manejador que se ha instalado con la opción -r reenvía una señal. Si no se especifica N nos informa de cuál es su valor
- seninfo
- [-cont] [-cero] [S1] [S2] ...
- senpila
- [tam] [dir] Establece una pila alternativa de tamaño tam para la ejecución de
las señales en la dirección de memoria dir. Si no se especifica dirección, se obtendrá una asignando mediante malloc
del tamaño que se le indica. (/***/ es posible que, especificando alguna dirección de memoria concreta como pila alternativa,
se pueda producir un fallo de segmentación al recibir una señal cuyo manejador se ejecuta en dicha pila). Si no se especifica tam
nos muestra la dirección y el tamaño de la pila alternativa
- senmasc
- [-n|-d] S1 S2 ... Enmascara o desenmascara (mediante sigprocmask)
las señales S1, S2 .... Si no se especifican señales nos informa de las que están enmascaradas.
- senmasc [S1] [S2] ... Enmascara (mediante sigprocmask)
las señales S1, S2 ....
- senmasc -n [S1] [S2] ... Hace que el conjunto de señales enmascaradas del proceso sea (mediante sigprocmask)
S1, S2 ....
- senmasc -d [S1] [S2] ... Desenmascara (mediante sigprocmask)
las señales S1, S2 ....
- bucle
- Hace que el shell entre en un bucle infinito. Instala un manejador para SIGINT
que permite salir del bucle pulsando control-c para seguir ejecutando el shell.
- segmentation
- produce un fallo de segmentación en el shell.
(No vale enviar SIGSEGV, tiene que ser un fallo de segmentación de verdad). (/***/ evidentemente produce un error en
tiempo de ejecución)
Información detallada de las llamadas al sistema y las funciones de la librería debe
obternerse con man (sigprocmask, sigaction, sigaltstack, ...)
Para comprobar el funcionamiento de flag SA_RESTART en sigaction es conveniente que contemplemos el caso de que la función que lee de la entrada puede devolver
un error (NO DEBE TERMINAR EL PROCESO EN CASO DE QUE ESO OCURRA). Por ejemplo
if (fgets(linea, stdin, MAXLINEA)==NULL)
perror ("Error al leer de teclado");
FORMA DE ENTREGA
Como en prácticas anteriores
FECHA DE ENTREGA VIERNES 23 DICIEMBRE DE 2012