Sabemos que - além de SIGKILL
e SIGSTOP
- um programa pode interceptar sinais IPC e executar seu manipulador interno contornando a operação do manipulador padrão.
Posso pensar em pelo menos uma razão muito boa para fazer isso com o SIGINT
sinal.
- Ou seja, implementar um manipulador de sinal que executa um último backup, salva um despejo de memória ou grava no log, antes de reverter para a operação de sinal padrão que encerra o processo.
Também consigo pensar em uma boa razão pela qual um malware pode capturar e bloquear o SIGINT:
Ou seja, para estender o tempo de execução do processo. Para a maioria dos usuários, Ctrl+ Cé o atalho de teclado para a maioria dos usuários de terminal e há muitos que desconhecem o Ctrl+ Z(
SIGTSTP
que apenas interrompe o processo, que permanece entre o terminaljobs
), sem falar no Ctrl+ \, que envia oSIGQUIT
e cria um despejo de núcleo.Se Ctrl+ Cfor pego e bloqueado, esses usuários provavelmente tentarão abrir outra janela de terminal e executarão algo como:
ps aux | grep [process name]
obtenha o PID do processo e execute o SIGKILL com
kill -9 [$PID]
Da mesma forma, os usuários que se conectam a uma sessão de terminal em uma máquina remota tentarão fazer uma segunda conexão com uma nova sessão de terminal e passarão por um processo/pesquisa PID semelhante para encerrar o culpado. Obviamente, essa tática pode estender o tempo de execução do processo por apenas um curto período, mas mesmo 3 minutos extras de um processo de transferência de arquivos usando uma conexão de alta largura de banda de 10 MB/s transferirão quase 2 GB de dados adicionais, então certamente há algum mérito em isto.
No entanto, recentemente notei - talvez apenas porque comecei a prestar atenção nisso - que existem programas que aparentemente se enquadram em outro subconjunto.
Esses programas, que são de código aberto e têm pacotes mantidos e examinados de perto o suficiente para esconder um grande pedaço de código de malware parece altamente improvável.
Eles não assumem o controle da entrada do teclado como
vim
e outros editores de textoEles têm manipuladores internos que capturam o SIGINT e o ignoram completamente. Não há finalização eventual do processo e, até onde sabemos, nenhuma tarefa crítica de última hora é tentada.
Minha pergunta :
Existe uma possível razão pela qual um processo pode optar por interceptar, mas descartar o SIGINT completamente para um propósito legítimo?
Em outras palavras, pode haver uma boa razão (do ponto de vista do código ou do sistema) ou situação em que capturar e ignorar SIGINT é mais vantajoso do que sua operação padrão conhecida que encerraria o processo em execução?
Como você descobriu, a razão mais provável para um programa ignorar SIGINTs é um bug. Programas bem comportados devem respeitar os sinais, e normalmente um SIGINT significa "por favor, saia", mas esse não é um comportamento obrigatório. Está inteiramente dentro do direito de um programa usar o SIGINT para seus próprios propósitos. De maneira semelhante, o SIGHUP é usado por muitos programas (daemons, normalmente) para significar "recarregar arquivos de configuração" em vez de "seu terminal de controle desligou".
É claro que se um programa deve lidar com o SIGINT de forma diferente, por essas razões ou por qualquer outra, é discutível. É provável que surpreenda ou confunda usuários como você que esperam que o programa saia razoavelmente rápido. Portanto, um programa bem comportado que está considerando lidar com SIGINT de maneira incomum deve garantir que esse comportamento faça sentido no contexto para (a maioria) dos usuários.
Este artigo (vinculado da Wikipedia ), entra em grandes detalhes sobre o SIGINT e o manuseio adequado e discute vários casos extremos que valem a pena considerar ao implementar o manuseio do SIGINT.