Funciones Útiles
Señales
Sistemas Operativos
https://faq.utnso.com.ar/signals
Señales – Caso base
inicio
ObtenerClave()
ObtenerTransacciones()
imprimir();
fin
Proceso
Ejecutar proceso
Fin proceso
Sistema Operativo
Espera…
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
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 – signal()
void (*signal(int sig, void (*func)(int)))(int)
Nos dijiste era una función simple
Es simple de implementar, no de documentar
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?
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;
…
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.
Señales – Notas
Las funciones manejadoras de señales tienen ciertas restricciones:
La lista de funciones seguras también está especificada por POSIX (link).
Señales – raise()
Dame una señal!!
int raise(int sig)
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");
}
Señales – Links Utiles
Generalidades sobre señales: http://man7.org/linux/man-pages/man7/signal.7.html
Funcion signal(): http://man7.org/linux/man-pages/man2/signal.2.html
Funcion sigaction(): http://man7.org/linux/man-pages/man2/sigaction.2.html
Funcion raise():
http://man7.org/linux/man-pages/man3/raise.3.html
Funciones manejadoras seguras: http://www.ibm.com/developerworks/library/l-reent/
Problemas usando execve() desde un handler de signal():
http://mgarciaisaia.github.io/tutorial-c/blog/2013/12/31/me-di-cuenta-que-me-tiraste-la-senal/