Eliminar un controlador de señal de Linux en C

2 minutos de lectura

Avatar de usuario de Breakdown
Desglose

Yo suelo:

signal(SIGINT, CtrlHandler);

Para agregar un controlador de SIGINT evento. Pero, ¿cómo puedo eliminar este controlador?

Avatar de usuario de Omnifarious
De todo género

Aquí está lo que haces:

signal(SIGINT, SIG_DFL);

Eso restablece el controlador de señal a cualquiera que sea el comportamiento predeterminado para esa señal (incluida la disposición predeterminada si no se ha configurado). En el caso de SIGINT, está abortando su proceso sin un volcado del núcleo.

el manual para signal explica por qué esto funciona:

signal(signum, handler) establece la disposición de la señal signum a handlerque es SIG_IGN, SIG_DFL, o la dirección de una función definida por el programador (un “controlador de señales”). … Si la disposición se establece en SIG_DFLentonces ocurre la acción predeterminada asociada con la señal.

También puede encontrar esta información utilizando el man dominio. si escribes man signal en la línea de comando y léelo, deberías verlo.

Esto es muy específico para el caso en el que ha reemplazado el controlador de señal predeterminado del sistema. En algunas situaciones, lo que desea es simplemente restaurar cualquier controlador que haya en primer lugar. Si nos fijamos en la definición de signal se parece a esto:

sighandler_t signal(int signum, sighandler_t handler);

Entonces, devuelve un sighandler_t. los sighandler_t que devuelve representa la ‘disposición’ previa de la señal. Entonces, otra forma de manejar esto es simplemente guardar el valor que devuelve y luego restaurar ese valor cuando desee eliminar su propio controlador.

  • @jameshfisher – Gracias por la edición. A veces me frustro con la gente que no lee el manual. 🙂

    – Omnifaro

    15 de enero de 2017 a las 20:34

  • ¿Qué sucede si una aplicación instaló su propio controlador de señales y luego una biblioteca instaló uno temporalmente? En este caso, la biblioteca necesita restaurar el controlador anterior y no el predeterminado.

    – jww

    30 de noviembre de 2018 a las 2:33

  • @jww: abordé este problema. ¿Es eso lo que estabas buscando?

    – Omnifaro

    30 de noviembre de 2018 a las 19:09

¿Ha sido útil esta solución?