Come uccidere un singolo thread nell'ambito di un processo in Linux?


13

inserisci qui la descrizione dell'immagine

Questi sono i singoli thread del processo di ricezione pacchetti. C'è un modo per uccidere ogni singolo thread? Linux fornisce qualche comando specifico che può uccidere o inviare un segnale di arresto a un particolare thread nell'ambito di un processo?


Qual è il tuo programma Packet Reciever? (Non ce l'ho sul mio desktop Debian) Per favore, ditelo di più, forse fornite qualche link. Quindi modifica la tua domanda per migliorare.
Basile Starynkevitch,

1
Penso che non ti rendi conto che il segnale "stop" interrompe un processo, indipendentemente dal thread a cui lo invii.
David Schwartz,


1
@ Md.Kawsaruzzaman Che non funzionerà. Supponiamo, ad esempio, che il thread sia nel mezzo dell'allocazione della memoria e mantenga il blocco sull'allocatore di memoria. Se interrompi il thread, non rilascerà mai il blocco e alla fine anche gli altri thread si fermeranno. Qualunque cosa tu stia cercando di fare, non è questo il modo di farlo. (Può darsi che tu voglia fermare il lavoro che il thread sta facendo. Ma è necessaria la cooperazione del processo per farlo. Se non fornisce alcun modo per farlo, non può essere fatto.)
David Schwartz,

1
Si noti inoltre che, nello screenshot, ogni "thread" ha un PID separato. Non sono sicuro che potresti anche indirizzare thread separati, poiché i segnali potrebbero essere inviati solo ai processi.
szalski,

Risposte:


16

In genere è abbastanza pericoloso uccidere un singolo thread da un processo più ampio. Quella discussione potrebbe:

  • Modifica uno stato condiviso con altri thread che potrebbero essere danneggiati
  • Tieni in mano un blocco che non viene mai liberato, rendendo il blocco indefinitamente non disponibile
  • ... o un numero qualsiasi di altre cose che potrebbero causare errori negli altri thread.

In generale, al di fuori della gestione e della sincronizzazione da parte dell'applicazione stessa, uccidere singoli thread non è una cosa sensata da fare.


5
Questo non è affatto utile. OP chiede come uccidere un thread, non se dovrebbero o meno.
Martin,

Quello che voglio è il processo per uccidere o interrompere qualsiasi thread particolare per qualche scopo. Presumo che a causa di un errore, a volte il nostro ricevitore venga spento automaticamente. Stiamo trovando le cause mentre il programma è sviluppato dalla nostra stessa R&S. Ora il fatto è che può esserci la possibilità che alcuni thread vengano automaticamente chiusi. Abbiamo testato dal lato del codice e ottenuto che il thread figlio è indipendente ma dal lato server continuano a ottenere alcuni thread a volte che causano anche l'arresto del processo totale ..
Md. Kawsaruzzaman

12

È possibile utilizzare tgkill (2) o tkillnel programma C (è necessario utilizzare syscall (2) ) ma non si desidera . Dall'interno del tuo programma puoi usare pthread_kill (3) - che è raramente utile.

(Non so esattamente quale effetto avrebbe tgkillo tkill- ad esempio con SIGKILLo SIGTERM- su un thread)

La libreria pthreads (7) usa oggetti di basso livello (inclusi alcuni segnali (7) -s e futex (7) -s ecc ...; vedi anche nptl (7) ) e se hai ucciso (con tkillo tgkill) alcuni singolo thread, il tuo processo sarebbe in uno stato sbagliato ( comportamento così indefinito ) perché alcuni invarianti interni sarebbero rotti.

Quindi studia la documentazione del tuo programma ricevitore di pacchetti e trova un altro modo. Se è un software libero , studia il suo codice sorgente e miglioralo.

Leggere più attentamente segnale (7) e sicurezza del segnale (7) . I segnali sono pensati per essere inviati ai processi (da kill (2) ) e gestiti in thread.

E in pratica, segnali e thread non si sposano bene. Leggi alcuni tutorial pthread .

Un trucco comune, quando si codifica un programma multi-thread (e si desidera gestire segnali esterni come SIGTERM) è usare una pipe (7) per il proprio processo e poll (2) quella pipe in qualche altro thread (si potrebbe anche considerare Linux signalfd specifico (2) ), con un hander di segnale scrivere (2) -ing un byte o alcuni di essi in quella pipe. Quel trucco ben noto è ben spiegato nella documentazione di Qt (e potresti usarlo nel tuo programma, anche senza Qt).


4
La tgkillfunzione non fornisce alcun modo per terminare un thread. Invia un segnale a un thread. Si chiama "kill" perché è il modo storico di uccidere un processo e non può essere usato per uccidere un thread.
David Schwartz,

Immagino che l'invio SIGKILLdi un thread sia dannoso. O uccide sempre l'intero processo? E che dire SIGTERM? A proposito, anche se viene danneggiato solo un thread, il mio punto è che il processo è in pessime condizioni.
Basile Starynkevitch,

5
Sì, i segnali SIGKILLe SIGTERMsono definiti per interrompere o terminare il processo. Questo è vero indipendentemente da quale thread li riceve: significano ancora la stessa cosa. Terminare un thread senza la stretta collaborazione del suo processo sarebbe un gioco di schifezze e probabilmente catastrofico per il processo.
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.