¿por qué escribir Ctrl + c detiene dos veces un proceso en ejecución en Linux?

24

Hay programas de Linux, por ejemplo vlc, que recomiendan escribir ctrl+ cdos veces para matar su ejecución desde un terminal si el programa no se detuvo después del primero.

¿Por qué escribir ctrl+ cdos veces funciona cuando la primera vez no funciona?

719016
fuente
66
[citación necesitada]
Ignacio Vazquez-Abrams

Respuestas:

35

Lo que hace es completamente específico de la aplicación. Cuando presiona ctrl+ c, el emulador de terminal envía una señal SIGINT a la aplicación en primer plano, que activa el "controlador de señal" apropiado. El controlador de señal predeterminado para SIGINT finaliza la aplicación. Pero cualquier programa puede instalar su propio controlador de señal para SIGINT (incluido un controlador de señal que no detiene la ejecución).

Aparentemente, vlc instala un controlador de señal que intenta realizar una limpieza / terminación elegante la primera vez que se invoca, y vuelve al comportamiento predeterminado de terminar la ejecución instantáneamente cuando se invoca por segunda vez.

Riccardo Murri
fuente
3
En algunos sistemas, la señal se revierte a SIG_DFL después de una llamada al controlador (para evitar llamar al controlador dos veces en la misma señal); Esto se llama semántica SysV. Muchos programas no restablecen el controlador de señal a la configuración original del programa al final del controlador. Esto normalmente sería un error de programación. Lea más información sobre la página de manual de la señal (2) .
Arcege
16

SIGINT , la señal enviada por Ctrl+ C, convencionalmente le dice a un programa que salga a su ciclo principal de procesamiento de comandos, o si eso no tiene sentido, que salga limpiamente. Algunos programas ejecutan un procedimiento de limpieza cuando reciben un SIGINT. Si el programa está tan desordenado que el procedimiento de limpieza falla, en algunos programas, un segundo Ctrl+ Chace que el programa se cierre inmediatamente. Hacer esto depende de cada autor del programa.

Si un segundo Ctrl+ Cno mata al programa, intente Ctrl+ \, que envía SIGQUIT , un (señal pero todavía capturable) más violenta, o tratar de Ctrl+ Za suspender el programa y luego el killcomando (por ejemplo kill %1, que envía SIGTERM , una señal convencionalmente menos violento que SIGQUIT, al trabajo número 1). Si todo lo demás falla, elimine el programa con kill -KILL, también conocido como kill -9, enviando la señal inalcanzable SIGKILL .

Gilles 'SO- deja de ser malvado'
fuente