$ 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
Isso mostra o processo myp
com PID = 797 e quatro threads com diferentes SPIDs.
Como posso matar um segmento específico do processo sem matar todo o processo. Entendo que talvez não seja possível em alguns casos quando houver dependências fatais nesse segmento específico. Mas, é possível em qualquer caso? Sim, como?
Eu tentei kill 799
e o próprio processo foi encerrado. Agora não tenho certeza se isso ocorreu porque houve dependências que fizeram myp
falhar sem o processo 800
ou porque kill é simples, incapaz de matar processos individuais.
Threads são parte integrante do processo e não podem ser eliminados fora dele. Existe a função pthread_kill , mas ela se aplica apenas ao contexto do próprio encadeamento. Dos documentos no link:
Observe que pthread_kill () apenas faz com que o sinal seja tratado no contexto do encadeamento especificado; a ação do sinal (término ou parada) afeta o processo como um todo.
A resposta canônica para essa pergunta é: Com a cooperação do processo, por qualquer mecanismo que ele forneça. Sem a cooperação do processo, é impossível. O fato de o processo consistir em encadeamentos é um detalhe interno do processo que, por design intencional, não é exposto fora do processo.
Além da resposta de @ gkv, você pode dar uma olhada na função pthread_cancel(3)
, parte de <pthread.h>
. Na página do manual:
A função pthread_cancel () envia uma solicitação de cancelamento ao thread do thread. Se e quando o thread de destino reage à solicitação de cancelamento depende de dois atributos que estão sob o controle desse thread: seu estado e tipo de cancelabilidade.
Você pode encontrar tgkill () útil. É específico do Linux, como a página de manual menciona.
tgkill () envia o sinal sig para o thread com o ID do thread tid no grupo de threads tgid. (Por outro lado, kill (2) só pode ser usado para enviar um sinal para um processo (ou seja, grupo de encadeamentos) como um todo, e o sinal será entregue a um encadeamento arbitrário nesse processo.)