SISTEMAS OPERATIVOS II
Tercer curso Ingeniería Informática . Curso 2011-2012
Práctica 3: Procesos en Unix: Señales y credenciales
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, NO DEBE TERMINAR SU EJECUCIÓN, simplemente lo indicará 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.
Todo el tratamiento de señales se hará con las funciones de System VR4 (sigaction, sigprocmask, sigaltstack ...).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
- sigprocmask
- [-block|-unblock|-setmask] 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.
- sigprocmask -block [S1] [S2] ... Enmascara (mediante sigprocmask)
las señales S1, S2 ....
- sigprocmask -unblock [S1] [S2] ... Desenmascara (mediante sigprocmask)
las señales S1, S2 ....
- sigprocmask -setmask [S1] [S2] ... Hace que el conjunto de señales enmascaradas del proceso sea (mediante sigprocmask)
S1, S2 ....
- sigaltstack
- [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
- sigaction
- [-defaultl|-ignore|-handler] [-show] [-resend] [-resethand] [-onstack] [-nodefer] [-restart] [-sleepNN] [-maskSEN1] [-maskSEN2] ...S1 S2...
- limitresend
- [off|N] Limita el número de veces que un manejador que se ha instalado con la opción -resend reenvía la señal. Si no se suministra argumento nos informa de cuál es su valor.
off indica que se reenvíe continuamente
- $$
- siginfo [S1] [S2] ...Nos da información del estado de las señales SI, S2 ...: manejada (con la
dirección del menjador, los flags y la máscara asociada), ignorada o acción por defecto, asi como de si está enmascarada o no.
Si no se especifican señales nos muestra la información de todas
#siginfo INT HUP SEGV
INT Enmacarada manejador 0x30045a00 SA_RESTART SA_NODEFER
mascara asociada SIHGUP SIGUSR1
HUP No enmascarada Accion por defecto
SEGV No emmascarada Ignorada
- sigcount
- [-zero] [S1] [S2] ...
- sigcount [S1] [S2] ... Nos informa de los contadores de los manejadores de
las señales S1, S2 .... Si no se especifican señales nos muestra los contadores de todas.
- sigcount -zero [S1] [S2] ... Pone a cero los contadores de los manejadores de
las señales S1, S2 .... Si no se especifican señales pone a cero los contadores de todas.
- bucle
- Hace que el shell entre en un bucle infinito. Instala un manejador para SIGINT, desenmascara 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)
- uid [-l] [u]
- Cambia la credencial efectiva de usuario del proceso a u. Si se especifica -l, u representa un login, en caso contrario es el valor numérico de
la credencial. En caso de no poder cambiarla indicará con un mensaje de error el motivo. Si no se especifica ni -l ni u, uid muestra las credenciales de usuario del proceso.
Para cada credencial muestra el número, el login asociado y en nombre real del usuario
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 11 MAYO DE 2012