Práctica 3: Procesos en UNIX: señales
Continuar la codificación de un intérprete de comandos (shell) en UNIX. Al igual que en la práctica anterior:
En esta práctica el shell incorporará las funciones para comprobar el funcionamiento de los manejadores de señales, así como la posibilidad de enmascararlas e ignorarlas. Todo el manejo de señales se hará con la interface de System V R4 (sigaction, sigprocmask ...). Los nombres de la señales se especificarán sin el SIG. Pueden usarse las funciones que se suministran para convertir entre nombre de una señal y su valor como entero.
http://www.dc.fi.udc.es/~afyanez/Practicas/sources/senales.cEn programa ha de llevar un contador para cada señal que indica cuántas veces se ha ejecutado el manejador asociado a dicha señal. En comando count muestra o inicializa dicho contador.
Considérese que el número de señales es 32 (aun cuando NSIG es 64 en linux y 48 en solaris).
Establece una pila alternativa para la ejecución de los manejadores de las señales (los que se instalen con el flag SA_ONSTACK). tam representa el tamaño y addr la dirección. Si se especifica solo el tamaño la dirección se obtendrá asignándola con malloc(). Si se especifica sólo la dirección y no el tamaño se asumirá un tamaño de 16K. En caso de no suministrar argumentos, o de hacerlo manera incorrecta nos indicará el tamaño de la pila alternativa y de su dirección. Nótese que en caso de especificar la dirección no hay que llamar a malloc y dependiendo de cuál sea esa dirección podría producir error al ejecutar el manejador.
No da información del estado de cada señal: manejada (con la dirección del menjador, los flags y la máscara asociada al manejador), ignorada o acción por defecto, asi como de si está enmascarada o no. Si no se especifican señales nos informa de todas. Ejemplo
#signal INT HUP SEGV INT Enmacarada manejador 0x30045a00 SA_NODEFER. mascara asoc. SIGUSR1 HUP No enmascarada Accion por defecto SEGV No emmascarada Ignorada
Enmascara (mediante sigprocmask) las señales SEN1 SEN2 .... Si no se especifican señales nos informa de como están TODAS las señales (igual que el comando signal sin argumentos).
Desenmascara (mediante sigprocmask) las señales SEN1 SEN2 .... Si no se especifican señales nos informa de como están TODAS las señales (igual que el comando signal sin argumentos).
Ignora las señales SEN1 SEN2 .... Si no se especifican señales nos informa de como están las señales (igual que el comando signal sin argumentos).
Pone las señales SEN1 SEN2 ...a su acción por defecto. Si no se especifican señales nos informa de como están las señales (igual que el comando signal sin argumentos).
Nos informa de los contadores de la señales SEN1 SEN2 ..., con -r resetea los contadores de dichas señales. Si no se especifican señales lo hace para todas (tanto mostrar los contadores como resetearlos en su caso)
Instala un manejador para las señales SIG1, (SIG2 ...) (Recordar que el manejador es la función que se ejecuta CUANDO llega la señal). El manejador incrementará el contador que indica cuantas veces se ha ejecutado. Además se admitirán las siguientes opciones
Establece el número máximo de veces que el manejador instalado con -r se reenvía la señal (se utilizará para ello el contador de señales recibidas). Si no se especifica n se indicará a cuanto está establecido dicho valor. Un valor 0 indica que no hay límite predefinido.
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.
Produce un fallo de segmentación en el shell. (No vale enviar SIGSEGV, tiene que ser un fallo de segmentación de verdad).
Produce una excepción de la unidad en punto flotante en el shell. (No vale enviar SIGFPE, tiene que ser una excepción de la unidad en punto flotante de verdad).
Información detallada de las llamadas al sistema y las funciones de la librería debe obternerse con man (sigaction, sigprocmask, sigaltstack, ...)
FORMA DE ENTREGA Como en prácticas anteriores
FECHA DE ENTREGA VIERNES 15 MAYO 2009