Na ausência de um manipulador de sinal, o SIGTERM se comporta de forma idêntica ao SIGKILL?

Na ausência de um manipulador de sinal, o SIGTERM se comporta de forma idêntica ao SIGKILL?

A maioria das descrições de SIGTERM e SIGKILL apontam que SIGKILL,

Em contraste com SIGTERM e SIGINT, [...] não pode ser capturado ou ignorado [...] (Wikipédia)

Esta é a única diferença entre SIGTERM e SIGKILL? Em particular, se um processo não instala um manipulador SIGTERM, existe alguma diferença entre enviar SIGTERM ou SIGKILL para o processo?

Responder1

Na ausência de qualquer configuração de sinal, SIGTERMe SIGKILLsão na prática equivalentes, pelo menos do ponto de vista do processo eliminado, assim como os outros sinais cuja ação padrão é encerrar um processo, incluindo SIGUSR1e SIGUSR2. Comoilkkachuaponta, o processo pai é informado do sinal que encerrou o processo filho (que é como seu shell pode distinguir entre os sinais e imprimirpor exemplo“terminado” v. “sinal 1 definido pelo usuário”).

Conforme mencionado na Wikipedia, SIGKILLnão pode ser capturado ou ignorado, mas SIGTERMpode; observe que isso significa que um processo não precisa instalar um manipulador para SIGTERMser ineficaz, ele pode simplesmente bloqueá-lo ou ignorá-lo (vejasighold(), sigrelse()esigignore()).

POSIX como uma seção detalhada sobre ojustificativa por trás do tratamento de sinal. O Linuxsignal(7)os documentos da página de manual também sinalizam em detalhes.

Responder2

Esta é a única diferença entre SIGTERM e SIGKILL?

Não.

Uma grande diferença entre a SIGKILLe um não capturado SIGTERMé que o primeiro tambémacordarum processo parado (para que possa se destruir imediatamente), enquanto o último só terá efeito após um SIGCONT.

Exemplo simples:

$ sleep 1000 & sleep 1; kill -TSTP $!
[1] 6455

[1]+  Stopped                 sleep 1000
$ kill -TERM 6455
$ jobs
[1]+  Stopped                 sleep 1000
$ kill -CONT 6455
$ jobs
[1]+  Terminated              sleep 1000

Se você quiser ter certeza de que seu sinal TERM, HUP, INT, etc. tem algum efeito, você deve emparelhá-lo com um CONTsinal (em qualquer ordem).

As pessoas podem não entender isso facilmente por causa da magia interna do bash kill- quando usado com um ID de trabalho como %ou %1(ou com um pid negado) referindo-se a um paradotrabalho, ele vaifaça tudo isso sozinhoatrás das cortinas:

/* Give PID SIGNAL.  This determines what job the pid belongs to (if any).
   If PID does belong to a job, and the job is stopped, then CONTinue the
   job after giving it SIGNAL.  Returns -1 on failure.  If GROUP is non-null,
   then kill the process group associated with PID. */
int
kill_pid (pid, sig, group)

informação relacionada