it-swarm-ko.tech

프로세스의 특정 스레드를 어떻게 죽일 수 있습니까?

$ 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

PID = 797 인 프로세스 myp 및 다른 SPID를 가진 4 개의 스레드를 보여줍니다.

전체 프로세스를 죽이지 않고 프로세스의 특정 스레드를 어떻게 죽일 수 있습니까? 특정 스레드에 치명적인 종속성이있는 경우 일부 경우에는 가능하지 않을 수 있음을 이해합니다. 그러나 어떤 경우에도 가능합니까? 그래, 어떻게?

kill 799를 시도했는데 프로세스 자체가 종료되었습니다. 프로세스 800없이 myp이 (가) 실패한 종속성이 있었거나 kill이 개별 프로세스를 강제 종료 할 수 없기 때문에 확실하지 않습니다.

21
Lazer

스레드는 프로세스의 필수 부분이므로 외부에서 종료 할 수 없습니다. pthread_kill 함수가 있지만 스레드 자체의 컨텍스트에만 적용됩니다. 링크의 문서에서 :

Pthread_kill ()은 주어진 스레드의 컨텍스트에서만 신호가 처리되도록합니다. 신호 동작 (종료 또는 정지)이 프로세스 전체에 영향을 미칩니다

26
gvkv

이 질문에 대한 정식 답변은 다음과 같습니다. 프로세스의 협력을 통해 어떤 메커니즘을 제공하든 상관 없습니다. 프로세스의 협력 없이는 불가능합니다. 프로세스가 스레드로 구성된다는 것은 의도적 인 설계에 의해 프로세스 외부에 노출되지 않는 프로세스의 내부 세부 사항입니다.

6
David Schwartz

@gkv의 답변 외에도 pthread_cancel(3)의 일부인 <pthread.h>. 매뉴얼 페이지에서 :

Pthread_cancel () 함수는 취소 요청을 스레드 스레드로 보냅니다. 대상 스레드가 취소 요청에 응답하는지 여부와 해당 스레드가 제어하는 ​​두 가지 속성, 즉 취소 가능 상태 및 유형에 따라 다릅니다.

1
Ivan P

tgkill () 유용 할 수 있습니다. 매뉴얼 페이지에서 언급했듯이 Linux에 따라 다릅니다.

tgkill ()은 스레드 그룹 tgid의 스레드 ID tid를 사용하여 신호 sig를 스레드로 보냅니다. 대조적으로 kill (2)는 프로세스 (즉, 스레드 그룹)에 전체적으로 신호를 보내는 데만 사용할 수 있으며 신호는 해당 프로세스 내의 임의의 스레드로 전달됩니다.

1
Amit