PDF de programación - Master en Computación - Programación Concurrente - Bloque II: Programación concurrente en POSIX Introducción al estándar POSIX - Tema 7. Señales

Imágen de pdf Master en Computación - Programación Concurrente - Bloque II: Programación concurrente en POSIX Introducción al estándar POSIX - Tema 7. Señales

Master en Computación - Programación Concurrente - Bloque II: Programación concurrente en POSIX Introducción al estándar POSIX - Tema 7. Señalesgráfica de visualizaciones

Publicado el 14 de Enero del 2017
675 visualizaciones desde el 14 de Enero del 2017
47,3 KB
9 paginas
Creado hace 10a (14/10/2013)
1



Master en Computación

Programación Concurrente

Bloque II: Programación concurrente en POSIX

Introducción al estándar POSIX

Tema 1.
Tema 2. Sistema Operativo MaRTE OS
Tema 3. Gestión de Threads
Tema 4. Gestión del Tiempo
Tema 5. Planificación de Threads
Tema 6. Sincronización
Tema 7. Señales

Tema 8. Temporizadores y Relojes de Tiempo de Ejecución

Programación Concurrente

Tema 7. Señales

© M. Aldea, M. González

oct-13

Tema 7. Señales
7.1. Conceptos Básicos
7.2. Señales Existentes
7.3. Generación, Entrega y Aceptación
7.4. Señales en Procesos Multi-Thread
7.5. Funciones para Configurar Señales
7.6. Funciones para Envío y Aceptación de Señales
7.7. Ejemplo del Uso de Señales

© M. Aldea, M. González

oct-13

2

7.1 Conceptos Básicos

Programación Concurrente

Tema 7. Señales

7.1 Conceptos Básicos
Se trata de un mecanismo de intercambio de mensajes
Señal POSIX: mecanismo por el que un proceso o thread puede ser
notificado de, o afectado por, un evento producido en el sistema

• excepciones detectadas por hardware
• expiración de una alarma o temporizador
• finalización de una operación de I/O asíncrona
• llegada de un mensaje a una cola de mensajes
• mensaje enviado desde otro proceso o thread
• actividad del terminal, etc.

Número de señal:

• Entero positivo que identifica una señal. Existen también

constantes predefinidas para dar nombre a las señales

Programación Concurrente

© M. Aldea, M. González

oct-13

3

Tema 7. Señales

7.2 Señales Existentes

7.2 Señales Existentes

Algunas señales “no fiables”
Descripción

Nombre de Señal
SIGABRT
SIGALRM
SIGFPE
SIGILL
SIGINT
SIGKILL
SIGQUIT
SIGSEGV
SIGTERM
SIGUSR1
SIGUSR2
SIGBUS

Terminación anormal, p.e. con abort()
Timeout, p.e. con alarm()
Operación aritmética errónea, p.e. división por cero u overflow
Instrucción hardware inválida
Señal de atención interactiva (ctrl-C)
Señal de terminación (no puede ser “cazada” ni ignorada)
Señal de terminación interactiva (terminales)
Referencia a memoria inválida
Señal de terminación
Reservada para la aplicación
Reservada para la aplicación
Acceso a una porción indefinida de un objeto de memoria (opcional)
Todas las señales anteriores son “no fiables”, pues se pueden
perder si ya hay una señal del mismo número pendiente

Programación Concurrente

Tema 7. Señales

© M. Aldea, M. González

oct-13

4

7.2 Señales Existentes

Señales de Tiempo Real
Si se soporta la opción de señales de tiempo real, existen señales
con números comprendidos entre SIGRTMIN y SIGRTMAX, que son
señales de tiempo real, o “fiables”
Las señales de tiempo real:

• no se pierden (se encolan)
• se aceptan en orden de prioridad (a menor número de señal

mayor prioridad)

• tienen un campo adicional de información
• hay como mínimo 8

Programación Concurrente

Tema 7. Señales

© M. Aldea, M. González

oct-13

5

7.3 Generación, Entrega y Aceptación

7.3 Generación, Entrega y Aceptación
Cada thread tiene su propia máscara de señales que define las
señales bloqueadas para ese thread

• en un proceso monothread sólo existe la máscara de señales

del thread principal
Una señal se genera:

• cuando el evento que causa la señal ocurre

Una señal no bloqueada se entrega:

• cuando la señal causa al proceso la acción asociada: ignorar,

terminar el proceso o ejecutar un manejador

Una señal bloqueada se acepta:
• cuando se selecciona y devuelve por una función sigwait()

Programación Concurrente

© M. Aldea, M. González

oct-13

6

Tema 7. Señales

Diagrama de funcionamiento

7.3 Generación, Entrega y Aceptación

Recomendado para señales no manejadas

Ignorar

No bloqueada

Se entrega

Se genera
la señal

Se
desbloquea

Acción por defecto

Ejecutar un manejador

NO recomendado

Fin

Bloqueada

Pendiente

Si es de
tiempo
real, se
encola

Programación Concurrente

Tema 7. Señales

Señales Pendientes

sigwait()

Se acepta

Recomendado para señales manejadas

© M. Aldea, M. González

oct-13

7

7.3 Generación, Entrega y Aceptación

Señal pendiente:

• estado entre su generación y su entrega o aceptación
• observable cuando la señal está bloqueada (enmascarada)
• si ocurre un nuevo evento de una señal pendiente:
- si es una señal “no fiable”, el evento puede perderse
- si es una señal “de tiempo real”, y la opción SA_SIGINFO ha
sido especificada (ver sigaction()), la señal se encola

Programación Concurrente

Tema 7. Señales

© M. Aldea, M. González

oct-13

8

7.3 Generación, Entrega y Aceptación

Acciones Asociadas a una Señal
Hay tres tipos de acciones que se pueden asociar a una señal:
• SIG_DFL: acción por defecto (generalmente, terminar el
proceso)
• SIG_IGN: ignorar la señal
• puntero a función: capturar (o “cazar”) la señal, ejecutando un

manejador de señal
- al entregarse la señal, se ejecuta el manejador indicado
- una vez finalizado el manejador, se continúa el proceso en el

lugar interrumpido

- Los manejadores sólo pueden llamar a funciones “seguras”

Programación Concurrente

© M. Aldea, M. González

oct-13

9

Tema 7. Señales

7.4 Señales en Procesos Multi-Thread

7.4 Señales en Procesos Multi-Thread

Cada thread tiene su propia máscara de señales
• define las señales bloqueadas para ese thread
• la máscara se hereda del thread padre, y se puede modificar

Una señal se puede generar para un proceso o un thread

• si el evento es a causa de un thread, se envía a ese thread

- p.e. una excepción hardware

• si el evento es asíncrono al proceso, se envía al proceso
- p.e. expiración de un temporizador
• las señales generadas en asociación a un pid se envían al
proceso; en asociación a un tid, se envían al thread

Programación Concurrente

Tema 7. Señales

© M. Aldea, M. González

oct-13

10

7.4 Señales en Procesos Multi-Thread

Señales en Procesos Multi-Thread
Una señal generada para un thread
• si no está bloqueada: se entrega
• si está bloqueada y la acción no es “ignorar”: se queda
pendiente hasta que se acepta con sigwait() o se desbloquea
• si está bloqueada y la acción es “ignorar”: no especificado

(cont.)

Una señal generada para un proceso:

• si la acción no es ignorar, se envía a un único thread que esté
esperando en un sigwait(), o a un thread que no tenga la
señal bloqueada
• si no se entrega, la señal queda pendiente hasta que un thread
llame a sigwait(), un thread desbloquee la señal, o la acción
asociada se ponga a “ignorar”

Programación Concurrente

Tema 7. Señales

© M. Aldea, M. González

oct-13

11

Uso Recomendado de Señales en Procesos

7.4 Señales en Procesos Multi-Thread

Multithread

El thread principal enmascara todas las señales que se vayan a
usar (salvo las destinadas a finalizar el proceso)

• los demás threads heredan esta máscara y no la modifican

No se usan "manejadores de señal"; en su lugar, se crean threads
que aceptan señales con sigwait(). Ventajas:
• se puede especificar la prioridad a la que se ejecuta la función

manejadora

• la función manejadora se ejecuta en un contexto conocido y sin

restricciones (el del thread)
- por el contrario, el contexto en que se ejecutan los

manejadores de señal no está definido por el estándar y
desde ellos sólo se puede invocar funciones "seguras"

Programación Concurrente

© M. Aldea, M. González

oct-13

12

Tema 7. Señales

7.5 Funciones para Configurar Señales

7.5 Funciones para Configurar Señales
Manipular conjuntos de señales:

#include <signal.h>
int sigemptyset (sigset_t *set);
int sigfillset (sigset_t *set);
int sigaddset (sigset_t *set, int signo);
int sigdelset (sigset_t *set, int signo);
int sigismember (const sigset_t *set,
int signo);

Estas funciones no afectan de forma directa al comportamiento
del sistema

Programación Concurrente

Tema 7. Señales

© M. Aldea, M. González

oct-13

13

7.5 Funciones para Configurar Señales

Cambio de la acción asociada a una señal
Examinar y cambiar la acción asociada a una señal:
int sigaction (int sig,
const struct sigaction *act,
struct sigaction *oact);
• si act es NULL, la acción actual no se cambia
• si oact no es NULL, la acción actual se devuelve en *oact

Programación Concurrente

© M. Aldea, M. González

oct-13

14

Tema 7. Señales

Estructura sigaction
struct sigaction {
void (*) (int signo) sa_handler;

// SIG_DFL, SIG_IGN, o puntero a función
// manejadora de señal

sigset_t sa_mask;

7.5 Funciones para Configurar Señales

// señales a ser bloqueadas mientras se ejecuta
// el manejador (además de la señal manejada)

int sa_flags;

// si vale SA_SIGINFO la señal se encola y lleva
// información asociada; el manejador es
// sa_sigaction

void (*)(int signo,siginfo_t *info,
void *context) sa_sigaction;

// puntero a función manejadora de señal
// (SA_SIGINFO). context no está especificado por
// el estándar

};

Programación Concurrente

© M. Aldea, M. González

oct-13

15

Tema 7. Señales

Configurar una señal de tiempo real
La función sigaction() nos permite configurar una señal para
que tenga comportamiento de tiempo real:

7.5 Funciones para Configurar Señales

• no se pierde (se encola)
• se acepta en orden de prioridad (a menor número de señal

mayor prioridad)

• tiene un campo adicional de información
• señales comprendidas entre SIGRTMIN y SIGRTMAX
// configura la señal SIGRTMIN para que tenga
// comportamiento de tiempo real y no instala
// manejador (se utilizará sigwait)
struct sigaction sigact;
sigact.sa_handler=SIG_DFL;
sigact.sa_flags=SA_SIGINFO;
CHKE( sigaction(SIGRTMIN, &sigact , NULL) );

© M. Aldea, M. González

oct-13

16

Programación Concurrente

Tema 7. Señales

Información Asociada a una Señal de TR
Las señales de tiempo real pueden llevar información asociada

- representada mediante una estructura siginfo_t

7.5 Funciones para Configurar Señales

typedef struct {

int si_signo; // número de señal
int si_code; // causa de la señal:
// SI_USER: enviada por kill()
// SI_QUEUE: enviada por sigqueue()
// SI_TIMER: expiración de un temporizador
// SI_ASYNCIO: fin de operación de I/
  • Links de descarga
http://lwp-l.com/pdf1095

Comentarios de: Master en Computación - Programación Concurrente - Bloque II: Programación concurrente en POSIX Introducción al estándar POSIX - Tema 7. Señales (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad