$ 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
프로세스 자체가 종료되었습니다. 이제 myp
프로세스 없이 실패 하는 종속성이 있기 때문인지 800
, 아니면 죽이는 것이 사소하기 때문에 단일 프로세스를 죽일 수 없기 때문인지 확실하지 않습니다 .
답변1
스레드는 프로세스의 필수적인 부분이며 프로세스 외부에서 종료될 수 없습니다. 일부는pthread_kill함수이지만 스레드 자체의 컨텍스트 내에서만 작동합니다. 링크의 문서에서:
pthread_kill()은 주어진 스레드의 컨텍스트 내에서만 신호가 처리되도록 합니다.신호 조치(종료 또는 중지)는 전체 프로세스에 영향을 미칩니다.
답변2
이 질문에 대한 일반적인 대답은 프로세스의 협력을 통해 제공되는 메커니즘이 무엇이든 이 것입니다. 이는 프로세스의 협력 없이는 불가능합니다. 프로세스가 스레드로 구성된다는 점은 프로세스 내부의 세부 사항, 즉 의도적으로 설계되었으며 프로세스 외부에 노출되지 않는 부분이다.
답변3
당신은 찾을 수 있습니다tgkill()효과가있다. 매뉴얼 페이지에서 언급했듯이 Linux에만 해당됩니다.
tgkill()은 스레드 그룹 tgid에 있는 스레드 ID tid를 가진 스레드에 신호 sig를 보냅니다. (반대로, kill(2)은 전체 프로세스(즉, 스레드 그룹)에 신호를 보내는 데에만 사용할 수 있으며 신호는 프로세스 내의 모든 스레드에 전달됩니다.)
답변4
@gkv의 답변 외에도 pthread_cancel(3)
의 일부인 함수를 볼 수도 있습니다 <pthread.h>
. 매뉴얼 페이지에서:
pthread_cancel() 함수는 스레드에 취소 요청을 보냅니다. 대상 스레드가 취소 요청에 반응하는지 여부와 시기는 해당 스레드가 제어하는 두 가지 속성, 즉 취소 가능성 상태와 유형에 따라 달라집니다.