Herramientas de usuario

Herramientas del sitio


senales

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
senales [2014/06/03 14:11] – [Señales y setjmp/longjmp] lmateusenales [2016/11/24 13:13] (actual) – [sigaction/sigprocmask] lmateu
Línea 214: Línea 214:
 una traza de todos los recursos pedidos para así liberarlos cuando se cumpla el timeout.  Esto una traza de todos los recursos pedidos para así liberarlos cuando se cumpla el timeout.  Esto
 no es trivial de hacer. no es trivial de hacer.
 +
 +También hay que considerar que la invocación de la rutina que atiende la señal puede provocar dataraces.
 +Por ejemplo supongamos que la función f usa malloc.  La señal del timeout puede gatillarse justo a la mitad
 +del malloc y por lo tanto el heap que maneja malloc queda en un estado inconsistente.  Si la función que atiende
 +la señal también invoca malloc, se puede producir una inconsistencia que gatille un segmentation fault o
 +que se entregue 2 veces el mismo pedazo de memoria.  Por lo tanto las acciones de la rutina de atención de la
 +señal deben ser simples como asignar una variable global por ejemplo.
 ==== sigaction/sigprocmask ==== ==== sigaction/sigprocmask ====
  
Línea 225: Línea 232:
   * etc.   * etc.
  
-Del mismo modo, sigprocmask permite deshabilitar/activar señales explícitamente.+Del mismo modo, sigprocmask permite deshabilitar/activar señales explícitamente.  Esta función es de utilidad por ejemplo 
 +para resolver el datarace asociado al uso de malloc tanto en el código en donde puede ocurrir una señal como en la función 
 +que atiende esa señal.  La solución está en invocar sigprocmask antes de invocar malloc para inhibir la señal en cuestión e 
 +invocar nuevamente sigprocmask para reactivar nuevamente la señal.  De esta forma si se gatilla la señal mientras se ejecuta 
 +malloc, la señal quedará pendiente y solo se invocará la rutina de atención cuando se reactive la señal en la 
 +segunda llamada de sigprocmask. 
 Consulte la página del manual para averiguar más sobre estas funciones. Consulte la página del manual para averiguar más sobre estas funciones.
 +
 +==== Ejercicio ====
 +
 +Resuelva la parte c de la pregunta 1 del [[http://users.dcc.uchile.cl/~lmateu/CC3301/controles/c3-142.pdf|control 3 de 2014/2]].  Pruebe su solución con el archivo [[http://users.dcc.uchile.cl/~lmateu/CC3301/download/largo.zip|largo.zip]].  En este problema la variable nodo podría apuntar a una dirección inválida.  Si trata de acceder a nodo->prox se gatillará la señal SIGSEGV que normalmente termina el proceso.  Para evitar que el proceso termine, Ud. debe capturar la señal SIGSEGV.  La dificultad está en que si la rutina que atiende la señal retorna, se volverá a hacer el acceso inválido.  Para eludir el acceso inválido Ud. debe usar sigsetjmp en la función largo e invocar siglongjmp en la rutina que atiende la señal.
senales.1401804677.txt.gz · Última modificación: 2014/06/03 14:11 por lmateu