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

Además deben tenerse en cuenta las siguientes indicaciones

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.

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] ...

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