Como matar um thread individual sob um processo no linux?

13

Estes são os threads individuais do processo Packet Receiver. Existe alguma maneira de matar qualquer segmento individual? O Linux fornece algum comando específico que possa matar ou enviar um sinal de parada para um determinado segmento sob um processo?

    
por Md. Kawsaruzzaman 12.11.2017 / 06:27

2 respostas

17

Geralmente é muito perigoso matar um thread individual de um processo maior. Esse segmento pode:

  • Modifique um estado compartilhado com outros segmentos que podem ser corrompidos
  • Mantenha algum bloqueio que nunca é liberado, fazendo com que o bloqueio se torne indefinidamente indisponível
  • ... ou qualquer outra coisa que possa fazer com que outros segmentos dêem errado.

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

    
por 12.11.2017 / 08:26
12

Você pode usar tgkill (2) ou tkill no seu programa em C (você precisará usar syscall (2) ), mas você não não quer . De dentro do seu programa você pode usar pthread_kill (3) - que raramente é útil. / p>

(não sei exatamente qual efeito teria tgkill ou tkill - por exemplo, com SIGKILL ou SIGTERM - em um thread)

A biblioteca pthreads (7) usa material de baixo nível (incluindo alguns < href="http://man7.org/linux/man-pages/man7/signal.7.html"> sinal (7) -s e futex(7) -s etc ...; veja também nptl (7) ) e se você matou raw (com tkill ou tgkill ) algum thread individual, seu processo estaria em algum estado errado (então comportamento indefinido ) porque alguma invariante interna seria quebrada.

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

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

E na prática, sinais e tópicos não se casam bem. Leia alguns tutorial de pthread .

Um truque comum, quando codificar um programa multi-threaded (e querer lidar com sinais externos como SIGTERM ) é usar um pipe (7) para o seu próprio processo e poll (2) aquele pipe em algum outro thread (você também pode considerar o específico do Linux signalfd (2) ), com um manipulador de sinais escreva ( 2) - inserindo um byte ou alguns deles naquele tubo. Esse truque bem conhecido é bem explicado na documentação do Qt (e você pode usá-lo em seu próprio programa , mesmo sem Qt).

    
por 12.11.2017 / 08:10