it-swarm-es.tech

¿Cómo puedo matar un hilo particular de un proceso?

$ ps -e -T | grep myp | grep -v grep
  797   797 ?        00:00:00 myp
  797   798 ?        00:00:00 myp
  797   799 ?        00:00:00 myp
  797   800 ?        00:00:00 myp

Esto muestra el proceso myp con PID = 797 y cuatro subprocesos con diferentes SPID.

¿Cómo puedo matar un hilo particular del proceso sin matar todo el proceso? Entiendo que podría no ser posible en algunos casos cuando hay dependencias fatales en ese hilo en particular. Pero, ¿es posible en cualquier caso? Es si, como?

Lo intenté kill 799 y el proceso en sí fue terminado. Ahora no estoy seguro de que esto se deba a que hubo dependencias que hicieron que myp fallara sin el proceso 800 o porque kill es simple, no puede matar procesos individuales.

21
Lazer

Los subprocesos son una parte integral del proceso y no se pueden eliminar fuera de él. Existe la función pthread_kill pero solo se aplica en el contexto del hilo en sí. De los documentos en el enlace:

Tenga en cuenta que pthread_kill () solo hace que la señal se maneje en el contexto del hilo dado; la acción de la señal (terminación o detención) afecta el proceso en su conjunto.

26
gvkv

La respuesta canónica a esta pregunta es: con la cooperación del proceso, por cualquier mecanismo que proporcione. Sin la cooperación del proceso, es imposible. Que el proceso consista en hilos es un detalle interno del proceso que, por diseño intencional, no se expone fuera del proceso.

6
David Schwartz

Además de la respuesta de @ gkv, puede echar un vistazo a la función pthread_cancel(3), parte de <pthread.h>. Desde la página del manual:

La función pthread_cancel () envía una solicitud de cancelación al hilo del hilo. Si el subproceso de destino reacciona a la solicitud de cancelación y cuándo depende de él, depende de dos atributos que están bajo el control de ese subproceso: su estado y tipo de cancelabilidad.

1
Ivan P

Puede encontrar tgkill () útil. Es específico de Linux como se menciona en la página del manual.

tgkill () envía la señal sig al hilo con el ID de hilo tid en el grupo de hilos tgid. (Por el contrario, kill (2) solo se puede usar para enviar una señal a un proceso (es decir, un grupo de subprocesos) en su conjunto, y la señal se enviará a un subproceso arbitrario dentro de ese proceso).

1
Amit