Como matar um thread individual em um processo no linux?

13

insira a descrição da imagem aqui

Esses são os segmentos individuais do processo do Packet Receiver. Existe alguma maneira de eliminar qualquer thread individual? O Linux fornece algum comando específico que pode eliminar ou enviar um sinal de parada para qualquer thread em particular em um processo?

Md. Kawsaruzzaman
fonte
Qual é o seu programa Packet Reciever? (Eu não o tenho no meu desktop Debian) Por favor, diga mais, talvez forneça algum link. Então edite sua pergunta para melhorar.
Basile Starynkevitch
1
Eu acho que você não percebe que o sinal "stop" interrompe um processo, independentemente de qual thread você o envia.
David Schwartz
1
Anexar com GDB e matar o segmento , em seguida, desconecte.
Martin
1
@ Md.Kawsaruzzaman Isso simplesmente não funciona. Suponha, por exemplo, que o encadeamento esteja no meio da alocação de memória e mantenha o bloqueio no alocador de memória. Se você parar o encadeamento, ele nunca liberará a trava e, eventualmente, os outros encadeamentos também serão interrompidos. O que quer que você esteja tentando fazer, não é esse o caminho. (Pode ser que você queira interromper o trabalho que o thread está fazendo. Mas você precisa da cooperação do processo para fazer isso. Se não houver uma maneira de fazê-lo, não poderá ser feito.)
David Schwartz
1
Observe também que, na sua captura de tela, cada "thread" possui um PID separado. Não tenho certeza de que você possa direcionar segmentos separados, pois os sinais podem ser enviados apenas aos processos.
szalski

Respostas:

16

Geralmente, é bastante perigoso eliminar um encadeamento individual de um processo maior. Esse segmento pode:

  • Modifique algum estado compartilhado com outros threads que podem ser corrompidos
  • Mantenha uma trava que nunca é liberada, fazendo com que a trava fique indefinidamente indisponível
  • ... ou qualquer outra coisa que possa causar outros encadeamentos.

Em geral, fora do gerenciamento e da sincronização pelo próprio aplicativo, matar threads individuais não é algo que faz sentido.

Chris Down
fonte
5
Isso não é de todo útil. O OP está perguntando como matar um tópico, não se deve ou não.
Martin Martin
O que eu quero é o processo para matar ou interromper qualquer segmento específico para algum propósito. Suponho que, devido a algum erro, às vezes nosso receptor seja desligado automaticamente. Estamos descobrindo as causas conforme o programa é desenvolvido por nossa própria P&D. Agora, o problema é que pode haver a possibilidade de alguns threads serem desligados automaticamente. Nós testamos a partir do lado de código e tenho esse segmento criança são independentes, mas do lado do servidor ainda recebendo alguns tópicos para baixo, por vezes, que causam processo total para desligar também ..
. Md Kawsaruzzaman
12

Você pode usar o tgkill (2) ou tkillno seu programa C (precisará usar o syscall (2) ), mas não deseja . De dentro do seu programa, você pode usar pthread_kill (3) - o que raramente é útil.

(Não sei exatamente qual efeito teria tgkillou tkill- por exemplo, com SIGKILLou SIGTERM- em um thread)

Os pthreads (7) coisas usos de baixo nível biblioteca (incluindo alguns sinais (7) -s e futex (7) -s etc ...; ver também nptl (7) ) e se você raw-morto (com tkillou tgkill) alguns thread individual, seu processo estaria em um estado errado ( comportamento indefinido ), porque algumas invariáveis ​​internas seriam interrompidas.

Portanto, estude a documentação do seu programa receptor de pacotes e encontre outra maneira. Se for um software livre , estude seu código-fonte e melhore-o.

Leia com mais atenção o sinal (7) e o sinal de segurança (7) . Os sinais devem ser enviados para processos (por kill (2) ) e manipulados em threads.

E, na prática, sinais e linhas não se casam bem. Leia o tutorial pthread .

Um truque comum, ao codificar um programa multiencadeado (e querer lidar com sinais externos como SIGTERM) é usar um canal (7) em seu próprio processo e pesquisar (2) esse canal em outro segmento (você também pode considerar o Linux específica signalfd (2) ), com um destro do sinal de escrita (2) ing um byte ou alguns deles naquele tubo. Esse truque conhecido é bem explicado na documentação do Qt (e você pode usá-lo em seu próprio programa, mesmo sem o Qt).

Basile Starynkevitch
fonte
4
A tgkillfunção não fornece nenhuma maneira de finalizar um encadeamento. Envia um sinal para um thread. É nomeado "kill" porque é a maneira histórica de matar um processo e não pode ser usado para matar um thread.
David Schwartz
Eu acho que o envio de um SIGKILLpara um thread está prejudicando-o. Ou está sempre matando todo o processo? E que tal SIGTERM? BTW, mesmo que apenas um segmento seja prejudicado, meu argumento é que o processo está em péssimo estado.
Basile Starynkevitch
5
Sim, os sinais SIGKILLe SIGTERMsão definidos para eliminar ou encerrar o processo. Isso é verdade, independentemente de qual thread os recebe - eles ainda significam a mesma coisa. Terminar um tópico sem a estreita cooperação de seu processo seria uma porcaria e provavelmente catastrófico para o processo.
David Schwartz