1 / 14

Señales

Señales. Práctica I. Objetivos. Captura de una señal y tratamiento de la misma Checkpointing. Señales. Las señales son interrupciones SW para informar de eventos asíncronos. Cada señal tiene asociado un número que la identifica. Señales más comunes El comportamiento frente a una señal:

cathal
Télécharger la présentation

Señales

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Señales Práctica I

  2. Objetivos • Captura de una señal y tratamiento de la misma • Checkpointing

  3. Señales • Las señales son interrupciones SW para informar de eventos asíncronos. Cada señal tiene asociado un número que la identifica. Señales más comunes • El comportamiento frente a una señal: • El proceso detiene su ejecución en la instrucción máquina que está ejecutando. • Captura la señal y pasa a ejecutar una RUTINA DE TRATAMIENTO DE LA SEÑAL (manejador de la señal). • Por último, sigue la ejecución por la instrucción donde fue interrumpido, a no ser que hubiera provocado el fin de la ejecución.

  4. Ejemplo de Señal Programa Principal Se ejecuta el programa principal Llega una señal Señal El programa ejecuta Rutina de tratamiento de la señal Rutina de tratamiento de la señal Continua la ejecución de programa en el punto donde se había quedado

  5. Señales II Si se produce la señal SIGINT (Ctrl+C), por defecto, finaliza la ejecución del programa. Nosotros podemos capturar dicha señal, y cambiar el tratamiento la señal para que no finalice la ejecución.. Captura de la Señal Ejecución del programa Ejecución del programa Señal

  6. Gestor de Señales • Los gestores de Señales más importantes son UNIX V, 4.3.BSD y POSIX • Nosotros vamos a utilizar POSIX

  7. Captura de la señal -> Función SIGACTION • Esta función sigaction determina la forma que tratará el proceso una determinada señal. Para utilizarla se necesita incluir la librería unistd.h • int sigaction(int signo, const struct sigaction *act, struct sigaction *oact); • signo: Número de la señal a tratar • *act: Estructura con información del nuevo tratamiento, si vale NULL, no se cambia nada. (Lo veremos en la siguiente transparencia) • *oact: Estructura donde se guarda la información del antiguo tratamiento, si vale NULL, no se guarda la información antigua

  8. Estructura con información del tratamiento de la señal-> STRUCT SIGACTION • La información de tratamiento de la señal se almacena en una estructura llamada sigaction • sa_handler= rutina de tratamiento de la señal. Puede ser una función implementada por nosotros, o SIG_DFL y SIG_IGN • sa_mask= mascara de admisión de señales. Si añadimos una señal a la mascara, esta se bloqueara mientras se ejecute la función indicada en el sa_handler. • sa_flags= flags y opciones struct sigaction{ void (*sa_handler) (); sigset_t sa_mask; int sa_flags; }

  9. Ejemplo • Vamos a capturar la señal SIGINT (Ctrl+C), y establecer la subrutina “Mirutina” para tratarla. #include <signal.h> #include <stdio.h> #include <unistd.h> int main() { int ret; struct sigaction señal; señal.sa_handler=Mirutina; señal.sa_flags=0; sigemptyset(&señal.sa_mask); ret=sigaction(SIGINT,&señal,NULL); if (ret==-1) printf(“No se pudo realizar el tratamiento de la función”); /* Bucle infinito de espera. pause() deja el proceso dormido hasta que llegue una señal. */ while (1) pause (); return 0;} void Mirutina(int s){ printf (“Estoy tratando la señal SIGINT\n”);} /*SI EL USUARIO TECLEA CTRL+C se produce la señal SIGINT, y en vez de finalizar el programa, se visualizará en pantalla :Estoy tratando la señal SIGINT*/

  10. Importante • Debemos, de crear una estructura sigaction, para cada una de las señales que queramos tratar en nuestro programa • Posteriormente, debemos utilizar una función sigaction para cada una de las estructuras que hemos creado inicialmente. • Ejemplo: • Si queremos en un mismo programa, capturar dos señales, por ejemplo SIGINT, SIGILL, lo que tenemos que hacer en programa principal es: • Primero crear dos estructuras sigaction, una para cada señal • struct sigaction señal1; • struct sigaction señal2; • Rellenar los campos de las estructuras (sa_handler,sa_flags,sa_mask) • Por ultimo utilizar la función sigaction • sigaction(SIGINT,señal1,NULL); • sigaction(SIGILL,señal2,NULL);

  11. Mascara de señales • Cuando hemos explicado la estructura sigactión, hemos hablado sobre el campo sigset sa_mask, el cual se encarga de admitir que lleguen otras señales mientras estamos tratando una en concreto. • Por ahora hemos utilizado la función sigemptyset(sigset_t *set): • se encarga de definir el set, como un conjunto vació de señales, es decir, permite que llegue cualquier señal. • Pero hay otras funciones interesantes para la mascara de señales: • sigaddset(sigset_t *set, int signo): añade una señal al conjunto, es decir, bloquea una señal mientras se realiza el tratamiento de otra. • sigfillset(sigset_t): define el set como un conjunto con todas las señales, es decir, bloquea todas las señales mientras se realiza el tratamiento de otra. • sigdelset(sigset_t *set,int signo): quita una señal de un conjunto

  12. Instrucciones complementarias • Para enviar una señal a un proceso, se ejecuta la instrucción: • kill(pid, id señal); • # include <sys/types.h> • #include <signal.h> • Para dormir a un proceso, se ejecuta la instrucción: • sleep(nº de segundos); • Para dejar dormido a un proceso hasta que llegue una señal se ejecuta: • pause();

  13. Ejercicio 44889922 Fichero .oculto Cifrar.c Indice_max Indice_min ad0df21 Fichero .oculto Programa: ./findkey 1 9999999 • For (i=indice_min;i<indice_max;i++) • Cifra el valor de “i” • Lee el fichero .oculto y compara si igual al valor cifrado de i • si la comparación es • Si comparación =1, muestra en pantalla el valor de i, y termina el bucle • Si comparación =0, sigue con la siguiente iteración

  14. Ejercicio 44889922 Fichero chek.txt Fichero .oculto 127 Cifrar.c ad0df21 Fichero .oculto Rutina de tratamiento de la señal findkey.c Señal Programa: ./findkey 0 9999999

More Related