por que digitar Ctrl + c duas vezes interrompe um processo em execução no Linux?


24

Existem programas Linux, por exemplo, vlc, que recomendam digitar ctrl+ cduas vezes para interromper a execução de um terminal se o programa não parar após o primeiro.

Por que digitar ctrl+ cduas vezes funciona quando a primeira vez não funciona?


6
[citação necessário]
Ignacio Vazquez-Abrams

Respostas:


35

O que ele faz é inteiramente específico da aplicação. Quando você pressiona ctrl+ c, o emulador de terminal envia um sinal SIGINT para o aplicativo em primeiro plano, que aciona o "manipulador de sinal" apropriado. O manipulador de sinal padrão para SIGINT finaliza o aplicativo. Mas qualquer programa pode instalar seu próprio manipulador de sinal para o SIGINT (incluindo um manipulador de sinal que não interrompe a execução).

Aparentemente, o vlc instala um manipulador de sinal que tenta fazer alguma limpeza / finalização normal na primeira vez que é invocado e volta ao comportamento padrão de finalizar instantaneamente a execução quando é invocado pela segunda vez.


3
Em alguns sistemas, o sinal é revertido para SIG_DFL após uma chamada para o manipulador (para evitar chamar o manipulador duas vezes no mesmo sinal); isso é chamado de semântica SysV. Muitos programas não definem o manipulador de sinal de volta às configurações originais no programa no final do manipulador. Normalmente, isso seria um bug de programação. Leia mais informações na página de manual do sinal (2) .
Arcege 21/08/19

16

SIGINT , o sinal enviado por Ctrl+ C, ordena a um programa que interrompa seu loop de processamento de comandos principal ou, se isso não faz sentido, saia corretamente. Alguns programas executam um procedimento de limpeza quando recebem um SIGINT. Se o programa estiver tão bagunçado que o procedimento de limpeza falhar, em alguns programas, um segundo Ctrl+ Cfaz com que o programa seja encerrado imediatamente. Isso é responsabilidade de cada autor do programa.

Se um segundo Ctrl+ Cnão matar o programa, tente Ctrl+ \, que envia SIGQUIT , um (sinal, mas ainda catchable) mais violento, ou tente Ctrl+ Zpara suspender o programa e, em seguida, o killcomando (por exemplo, kill %1que envia SIGTERM , um sinal convencionalmente menos violento que SIGQUIT, para o trabalho número 1). Se tudo mais falhar, interrompa o programa kill -KILL, também conhecido como kill -9, enviando o sinal inatacável SIGKILL .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.