En ausencia de un controlador de señales, ¿SIGTERM se comporta de manera idéntica a SIGKILL?

En ausencia de un controlador de señales, ¿SIGTERM se comporta de manera idéntica a SIGKILL?

La mayoría de las descripciones de SIGTERM y SIGKILL señalan que SIGKILL,

A diferencia de SIGTERM y SIGINT, [...] no se puede detectar ni ignorar [...] (Wikipedia)

¿Es esta la única diferencia entre SIGTERM y SIGKILL? En particular, si un proceso no instala un controlador SIGTERM, ¿hay alguna diferencia entre enviar SIGTERM o SIGKILL al proceso?

Respuesta1

En ausencia de cualquier configuración de señal, SIGTERMy SIGKILLson en la práctica equivalentes, al menos desde la perspectiva del proceso finalizado, al igual que las otras señales cuya acción predeterminada es terminar un proceso, incluidas SIGUSR1y SIGUSR2. Comoilkkachuseñala, el proceso padre es informado de la señal que terminó el proceso hijo (que es como su shell puede distinguir entre las señales e imprimirp.ej“terminado” versus “señal 1 definida por el usuario”).

Como se menciona en Wikipedia, SIGKILLno se puede detectar ni ignorar, mientras que SIGTERMsí; tenga en cuenta que esto significa que un proceso no necesita instalar un controlador para SIGTERMser ineficaz, simplemente puede bloquearlo o ignorarlo (versighold(), sigrelse()ysigignore()).

POSIX como una sección detallada sobre elRazón fundamental detrás del manejo de señales.. el linuxsignal(7)La página de manual también documenta las señales en detalle.

Respuesta2

¿Es esta la única diferencia entre SIGTERM y SIGKILL?

No.

Una gran diferencia entre a SIGKILLy no capturado SIGTERMes que el primero tambiéndespertarun proceso detenido (por lo que podría destruirse inmediatamente), mientras que este último sólo tendrá efecto después de un archivo SIGCONT.

Ejemplo sencillo:

$ 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

Si desea estar seguro de que su señal TERM, HUP, INT, etc. tenga algún efecto, debe emparejarla con una CONTseñal (en cualquier orden).

Es posible que las personas no entiendan esto fácilmente debido a la magia de la killfunción incorporada de bash, cuando se usa con una identificación de trabajo como %o %1(o con un pid negado) que se refiere a una tarea detenida.trabajo, va ahacer todo eso por sí mismodetrás de las 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)

información relacionada