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?
13
Respostas:
Geralmente, é bastante perigoso eliminar um encadeamento individual de um processo maior. Esse segmento pode:
Em geral, fora do gerenciamento e da sincronização pelo próprio aplicativo, matar threads individuais não é algo que faz sentido.
fonte
Você pode usar o tgkill (2) ou
tkill
no 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
tgkill
outkill
- por exemplo, comSIGKILL
ouSIGTERM
- 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
tkill
outgkill
) 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).fonte
tgkill
funçã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.SIGKILL
para um thread está prejudicando-o. Ou está sempre matando todo o processo? E que talSIGTERM
? BTW, mesmo que apenas um segmento seja prejudicado, meu argumento é que o processo está em péssimo estado.SIGKILL
eSIGTERM
sã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.