¿Cómo matar un hilo individual bajo un proceso en Linux?

13

ingrese la descripción de la imagen aquí

Estos son los hilos individuales del proceso del receptor de paquetes. ¿Hay alguna forma de matar cualquier hilo individual? ¿Linux proporciona algún comando específico que puede matar o enviar una señal de detención a un subproceso particular en un proceso?

MD Kawsaruzzaman
fuente
¿Cuál es su programa Receptor de paquetes? (No lo tengo en mi escritorio Debian) Por favor, diga más, tal vez proporcione algún enlace. Así que edite su pregunta para mejorar.
Basile Starynkevitch
1
Creo que no te das cuenta de que la señal de "detención" detiene un proceso, independientemente de a qué hilo lo envíes.
David Schwartz
1
Adjuntar con GDB y matar el hilo , luego desconectar.
Martin
1
@ Md.Kawsaruzzaman Eso simplemente no funcionará. Supongamos, por ejemplo, que el hilo está en el medio de la asignación de memoria y mantiene el bloqueo en el asignador de memoria. Si detiene el hilo, nunca liberará el bloqueo y, finalmente, los otros hilos también se detendrán. Lo que sea que intentes hacer, esta no es la forma de hacerlo. (Puede ser que quieras detener el trabajo que está haciendo ese hilo. Pero necesitas la cooperación del proceso para hacerlo. Si no proporciona una forma de hacerlo, no se puede hacer).
David Schwartz
1
También tenga en cuenta que, en su captura de pantalla, cada "hilo" tiene un PID separado. No estoy seguro de que incluso pueda apuntar a hilos separados, ya que las señales solo se pueden enviar a los procesos.
szalski

Respuestas:

16

En general, es bastante peligroso matar un hilo individual de un proceso más grande. Ese hilo podría:

  • Estar modificando algún estado compartido con otros hilos que podrían corromperse
  • Sostenga un candado que nunca se libera, lo que hace que el candado no esté disponible indefinidamente
  • ... o cualquier otra cantidad de cosas que podrían causar que otros hilos salgan mal.

En general, fuera de la administración y sincronización de la aplicación en sí, matar hilos individuales no es algo que tenga sentido hacer.

Chris Down
fuente
55
Esto no es útil en absoluto. OP pregunta cómo matar un hilo, no si deberían o no.
Martin
Lo que quiero es el proceso para matar o detener cualquier hilo en particular para algún propósito. Supongo que debido a algún error, a veces nuestro receptor se apaga automáticamente. Estamos encontrando las causas a medida que el programa es desarrollado por nuestra propia I + D. Ahora la cuestión es que puede existir la posibilidad de que algunos subprocesos se apaguen automáticamente. Hemos probado el código de un lado y consiguió ese hilo niño son independientes pero a partir del lado del servidor que sigue recibiendo algunos hilos hacia abajo, que a veces causan proceso total se apague también ..
Md. Kawsaruzzaman
12

Puede usar tgkill (2) o tkillen su programa C (necesitará usar syscall (2) ) pero no desea hacerlo . Desde el interior de su programa, puede usar pthread_kill (3) , que rara vez es útil.

(No sé exactamente qué efecto tendría tgkillo tkill, por ejemplo, con SIGKILLo SIGTERM- en un hilo)

La biblioteca pthreads (7) usa cosas de bajo nivel (incluyendo algunas señales (7) -s y futex (7) -s, etc ...; vea también nptl (7) ) y si mató sin procesar (con tkillo tgkill) alguna hilo individual, su proceso estaría en un estado incorrecto (entonces comportamiento indefinido ) porque se rompería algún invariante interno.

Así que estudie la documentación de su programa receptor de paquetes y encuentre otra forma. Si es software libre , estudie su código fuente y mejórelo.

Leer más atentamente señal (7) y la señal de seguridad (7) . Las señales deben enviarse a los procesos (por kill (2) ) y manejarse en subprocesos.

Y en la práctica, las señales y los hilos no se casan bien. Leer algunos tutorial de pthread .

Un truco común, al codificar un programa multiproceso (y querer manejar señales externas como SIGTERM) es usar una tubería (7) a su propio proceso y sondear (2) esa tubería en algún otro hilo (también puede considerar el Linux signalfd específico (2) ), con un gestor de señal escribir (2) --inging un byte o algunos de ellos en esa tubería. Ese conocido truco está bien explicado en la documentación de Qt (y puede usarlo en su propio programa, incluso sin Qt).

Basile Starynkevitch
fuente
44
La tgkillfunción no proporciona forma de terminar un hilo. Envía una señal a un hilo. Se llama "kill" porque es la forma histórica de matar un proceso y no se puede usar para matar un hilo.
David Schwartz
Supongo que enviar SIGKILLun mensaje a un hilo lo está perjudicando. ¿O siempre está matando todo el proceso? ¿Y de qué SIGTERM? Por cierto, incluso si solo un hilo está dañado, mi punto es que el proceso está en estado grave.
Basile Starynkevitch
55
Sí, las señales SIGKILLy SIGTERMestán definidas para matar o finalizar el proceso. Eso es cierto independientemente de qué hilo los reciba, todavía significan lo mismo. Terminar un hilo sin la estrecha cooperación de su proceso sería una basura y probablemente catastrófico para el proceso.
David Schwartz