Universidad Tecnológica Nacional

Facultad Regional Buenos Aires

Ingeniería en Sistemas de Información

Funciones Útiles

Señales

Sistemas Operativos

http://faq.utn.so/signals

Señales – Caso base

inicio

procedimiento1()

procedimiento2()

imprimir();

fin

Proceso

Ejecutar proceso

Fin proceso

Sistema Operativo

Espera…

Señales – Caso base

INTERRUPCIÓN

(SIGINT)

while(1) {

printf (“Hola mundo\n”);

}

Proceso

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

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

Señales – Ejemplo

void rutina (int n) {

switch (n) {

case SIGINT:

printf(“En tu cara, no salgo nada…\n”);

break;

case SIGUSR1:

printf(“LLEGO SIGUSR1\n”);

break;

}

}

void main () {

signal(SIGINT, rutina);

signal(SIGUSR1, rutina);

while(1) {

printf(“Hola Mundo\n”);

}

}

¿Que funcion ejecutar al recibir una señal?

Señales – Ejemplo

signal(SIGINT, rutina);

while(1) {

printf (“Hola mundo\n”);

}

SIGINT

void rutina (int n) {

switch (n) {

case SIGINT:

printf(“No salgo nada…”);

break;

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

Señales – Notas

En Linux, las señales siempre son atendidas por un thread del proceso, elegido arbitrariamente por el SO.

??

T1

T2

T3

TN

Proceso

Por defecto, el elegido es el thread principal.

Señales – Notas

Una señal puede interrumpir funciones sensibles (Ej: send(), recv(), select()). Dichas funciones estan 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.

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

Señales Links Utiles

Linux API - Señales - Google Slides