Como posso matar um segmento específico de um processo?

21
$ 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. Eu entendo que pode não ser possível em todos os casos, quando há dependências fatais nesse segmento específico. Mas, é possível em qualquer caso? É sim, como?

Eu tentei kill 799 e o processo em si foi encerrado. Agora não tenho certeza se isso ocorreu porque houve dependências que fizeram com que myp falhasse sem o processo 800 ou porque kill é simples e não é capaz de matar processos individuais.

    
por Lazer 23.08.2010 / 15:22

4 respostas

25

Threads são parte integrante do processo e não podem ser eliminados fora dele. Existe a função pthread_kill mas só se aplica no contexto do próprio tópico. A partir dos documentos no link:

Note that pthread_kill() only causes the signal to be handled in the context of the given thread; the signal action (termination or stopping) affects the process as a whole.

    
por 23.08.2010 / 15:53
6

A resposta canônica para esta questão é: Com a cooperação do processo, por qualquer mecanismo que ele forneça. Sem a cooperação do processo, é impossível. Que o processo consiste em threads é um detalhe interno do processo que é, por design intencional, não exposto fora do processo.

    
por 26.08.2011 / 13:59
1

Em cima da resposta do @gkv você pode dar uma olhada na função pthread_cancel(3) , parte de <pthread.h> . Na página do manual:

The pthread_cancel() function sends a cancellation request to the thread thread. Whether and when the target thread reacts to the cancellation request depends on two attributes that are under the control of that thread: its cancelability state and type.

    
por 24.08.2010 / 03:34
0

Você pode encontrar tgkill () útil. É específico do Linux como a página man menciona.

tgkill() sends the signal sig to the thread with the thread ID tid in the thread group tgid. (By contrast, kill(2) can only be used to send a signal to a process (i.e., thread group) as a whole, and the signal will be delivered to an arbitrary thread within that process.)

    
por 04.02.2014 / 23:42