프로세스의 특정 스레드를 종료하는 방법은 무엇입니까?

프로세스의 특정 스레드를 종료하는 방법은 무엇입니까?
$ 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() 함수는 스레드에 취소 요청을 보냅니다. 대상 스레드가 취소 요청에 반응하는지 여부와 시기는 해당 스레드가 제어하는 ​​두 가지 속성, 즉 취소 가능성 상태와 유형에 따라 달라집니다.

관련 정보