1 of 12

Funciones Útiles

Señales

Sistemas Operativos

https://faq.utnso.com.ar/signals

2 of 12

Señales – Caso base

inicio

ObtenerClave()

ObtenerTransacciones()

imprimir();

fin

Proceso

Ejecutar proceso

Fin proceso

Sistema Operativo

Espera…

3 of 12

Señales – Caso base

while(1) {

sleep(10000);

printf (“Hola mundo\n”);

}

Proceso

INTERRUPCIÓN

(SIGINT)

El sistema operativo se comunica con los procesos en ejecución mediante señales

4 of 12

Señales – Caso base

Una vez recibida la señal el proceso puede decidir dependiendo de su estado

→ Ignorarla

→ Ejecutar una rutina determinada

→ Ejecutar la operación por defecto

5 of 12

Señales signal()

void (*signal(int sig, void (*func)(int)))(int)

Nos dijiste era una función simple

Es simple de implementar, no de documentar

6 of 12

Señales – signal() - Ejemplo

void rutina (int n) {

switch (n) {

case SIGINT:

printf(“Sacame si te la bancas!!\n”);

break;

case SIGUSR1:

printf(“LLEGO SIGUSR1\n”);

break;

}

}

void main () {

signal(SIGINT, rutina);

signal(SIGUSR1, rutina);

while(1) {

printf(“Hola Mundo\n”);

sleep(1);

}

}

¿Que funcion ejecutar al recibir una señal?

7 of 12

Señales – signal() - Ejemplo

signal(SIGINT, rutina);

while(1) {

printf (“Hola mundo\n”);

sleep(1);

}

SIGINT

rutina (SIGINT)

3

1

Recibida la señal el programa ejecuta la rutina.

Concluida la ejecución retorna al punto del programa donde fue interrumpido

2

4

void rutina (int n) {

switch (n) {

case SIGINT:

printf(“No salgo nada…”);

break;

8 of 12

Señales – Notas

Una señal puede interrumpir funciones sensibles (Ej: send(), recv(), select()). Dichas funciones están especificadas por POSIX (link).

En estos caso la función retorna un error (EINTR) y debe ser reanudada manualmente.

Existen señales que no son ignorables, SIGKILL por ejemplo.

9 of 12

Señales – Notas

Las funciones manejadoras de señales tienen ciertas restricciones:

  • Deben retornar normalmente (cuidado con EXECV).

  • Solo pueden llamar a funciones seguras o async-signal-safe.

La lista de funciones seguras también está especificada por POSIX (link).

10 of 12

Señales raise()

Dame una señal!!

int raise(int sig)

11 of 12

Señales – raise() - Ejemplo

void signal_catch(int);

int main () {

signal(SIGINT, signal_catch);

printf("Se termina la charla??\n");

raise(SIGINT);

printf("Y… se nos termino la charla\n");

return(0);

}

void signal_catch(int signal) {

printf("No se termina maaaaas\n");

}

12 of 12

Señales Links Utiles