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

21
$ 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 mypcon 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 799y el proceso en sí fue terminado. Ahora no estoy seguro de que esto se deba a que hubo dependencias que hicieron mypfallar sin el proceso 800o porque matar es simple y no puede matar procesos individuales.

Lazer
fuente

Respuestas:

26

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.

gvkv
fuente
+1. solo para agregar aquí. dentro del proceso puedes usar pthread_kill () para enviar señales a un hilo individual. Es posible que pueda agregar algún controlador de señal que lo haga.
Hemant
@hemant: supongamos que MS Word usa un hilo separado para la corrección ortográfica. Matar ese hilo no debería derribar todo, a menos que esté diseñado de esa manera. ¿Por qué el proceso no puede existir sin ese hilo en situaciones como estas?
Lazer
1
Bueno, supongo que podría diseñar un modelo de subprocesos para que sea independiente de un proceso principal, pero permitiendo que los procesos externos eliminen los subprocesos dentro del proceso, pero eso abre una lata de gusanos con respecto a la seguridad, la gestión de procesos y la integridad del sistema que yo no ' No creo que ningún diseñador de sistemas se someta voluntariamente. Enhebrar es bastante difícil sin ese tipo de dolores de cabeza. Matar un hilo desde adentro no es un problema porque el trabajo lo realiza el proceso principal, que se hace responsable si surge algún problema y puede ser eliminado, de forma automática o de otro modo.
gvkv
"a menos que esté diseñado de esa manera": la razón principal para usar subprocesos es exactamente para que pueda compartir recursos. Es más bien como derribar media casa.
pjc50
2
@Lazer, un hilo no puede verificar la ortografía al mismo tiempo que otro hilo está actualizando el texto porque está escribiendo. Debido a esto, para tener un hilo de revisión ortográfica en segundo plano, debe hacer algo como agarrar un candado para evitar que el otro hilo cambie el texto, hacer una copia de algunas de las palabras, soltar el candado y luego verificar las palabras copiadas en el fondo. Si lo mataste mientras mantenía el bloqueo, colgarías el otro hilo tan pronto como trataras de escribir. Las aplicaciones multiproceso están llenas de interdependencias como esta.
psusi
6

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 está expuesto fuera del proceso.

David Schwartz
fuente
¿Y qué hay de enviar las otras señales desde la línea de comando?
yucer
@yucer No estoy seguro de entender lo que estás preguntando.
David Schwartz
Me refiero a enviar otra señal de la lista mostrada por "kill -l". Estoy buscando una manera de ordenar a un subproceso particular que descargue el seguimiento de la pila para ver qué está haciendo.
platillo
@yucer Eso va a ser específico de la plataforma. Algunos proporcionan una manera de ordenar un subproceso particular para volcar la pila. Personalmente, me ha resultado más fácil usar un script para adjuntar un depurador (como gdb) al proceso, ordenar a todos los subprocesos que descarguen la pila y luego desconectar.
David Schwartz
1

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 dos atributos que están bajo el control de ese subproceso: su estado y tipo de cancelabilidad.

Ivan P
fuente
1

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) como un todo, y la señal se enviará a un subproceso arbitrario dentro de ese proceso).

Amit
fuente
Esto no responde a la pregunta sobre cómo matar un hilo, no cómo enviar una señal a un hilo.
David Schwartz