Come posso uccidere un particolare thread di un processo?


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

Questo mostra il processo mypcon PID = 797 e quattro thread con SPID diversi.

Come posso uccidere un particolare thread del processo senza uccidere l'intero processo. Capisco che potrebbe non essere affatto possibile in alcuni casi quando ci sono dipendenze fatali su quel particolare thread. Ma è possibile in ogni caso? Sì, come?

Ho provato kill 799e il processo stesso è stato terminato. Ora non sono sicuro che ciò fosse dovuto al fatto che esistevano dipendenze che mypfallivano senza il processo 800o perché l'uccisione è semplice e non è in grado di uccidere i singoli processi.

Risposte:


26

I thread sono parte integrante del processo e non possono essere uccisi al di fuori di esso. C'è la funzione pthread_kill ma si applica solo nel contesto del thread stesso. Dai documenti al link:

Si noti che pthread_kill () causa la gestione del segnale solo nel contesto del thread specificato; l'azione del segnale (terminazione o arresto) influisce sul processo nel suo insieme.


+1. solo per aggiungere qui. all'interno del processo è possibile utilizzare pthread_kill () per inviare segnali al singolo thread. può darsi che tu possa aggiungere qualche gestore del segnale che lo fa.
Hemant,

@hemant: Supponiamo che MS Word usi un thread separato per il controllo ortografico. Uccidere quel thread non dovrebbe far crollare tutto, a meno che non sia progettato in quel modo. Perché il processo non può esistere senza quel thread in situazioni come queste?
Lazer,

1
Bene, suppongo che potresti progettare un modello di threading in modo che sia indipendente da un processo genitore, ma consentendo ai processi esterni di uccidere i thread all'interno del processo, ma ciò apre una lattina di worm in termini di sicurezza, gestione dei processi e integrità del sistema che non indosso " t pensa che qualsiasi progettista di sistema si sottometterebbe volentieri a. Il threading è abbastanza difficile senza quel tipo di mal di testa. Uccidere un thread dall'interno non è un problema perché il lavoro è svolto dal processo genitore che è ritenuto responsabile in caso di problemi e può essere ucciso, automaticamente o in altro modo.
gvkv,

"a meno che non sia progettato in questo modo": il motivo principale per l'utilizzo dei thread è esattamente quello di poter condividere le risorse. È piuttosto come abbattere mezza casa.
pjc50,

2
@Lazer, un thread non può controllare l'ortografia mentre un altro thread sta aggiornando il testo perché stai scrivendo. Per questo motivo, per avere un thread di controllo ortografico in background, deve fare qualcosa come prendere un lucchetto per impedire all'altro thread di cambiare il testo, fare una copia di alcune delle parole, rilasciare il lucchetto, quindi controllare le parole copiate nel sfondo. Se ti capitasse di ucciderlo mentre teneva il lucchetto, avresti appeso l'altro filo non appena avessi provato a digitare. Le applicazioni multithread sono piene di interdipendenze come questa.
psusi,

6

La risposta canonica a questa domanda è: con la cooperazione del processo, con qualunque meccanismo esso fornisca. Senza la cooperazione del processo, è impossibile. Il fatto che il processo sia costituito da thread è un dettaglio interno del processo che, per progettazione intenzionale, non è esposto al di fuori del processo.


E che dire dell'invio degli altri segnali dalla riga di comando?
yucer

@yucer Non sono sicuro di aver capito cosa stai chiedendo.
David Schwartz,

Intendo inviare un altro segnale dall'elenco mostrato da "kill -l". Sto cercando un modo per comandare un particolare thread per scaricare la traccia dello stack per vedere cosa sta facendo.
yucer

@yucer Sarà specifico per la piattaforma. Alcuni forniscono un modo per comandare un particolare thread per scaricare lo stack. Personalmente, ho trovato più semplice usare uno script per collegare un debugger (come gdb) al processo, comandare tutti i thread per scaricare lo stack e quindi staccare.
David Schwartz

1

In cima alla risposta di @ gkv puoi dare un'occhiata alla funzione pthread_cancel(3), parte di <pthread.h>. Dalla pagina man:

La funzione pthread_cancel () invia una richiesta di annullamento al thread della discussione. Se e quando il thread di destinazione reagisce alla richiesta di annullamento dipende da due attributi che sono sotto il controllo di quel thread: il suo stato e tipo di annullabilità.


1

Potresti trovare utile tgkill () . È specifico di Linux come menziona la pagina di manuale.

tgkill () invia il segnale sig al thread con l'ID thread tid nel gruppo thread tgid. (Al contrario, kill (2) può essere utilizzato solo per inviare un segnale a un processo (cioè, gruppo di thread) nel suo insieme, e il segnale verrà inviato a un thread arbitrario all'interno di quel processo.)


Questo non affronta la domanda su come uccidere un thread, non su come inviare un segnale a un thread.
David Schwartz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.