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


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

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

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

시도 kill 799하고 프로세스 자체가 종료되었습니다. 이제 myp프로세스없이 실패한 종속성이 있었 800거나 kill이 개별 프로세스를 죽일 수없는 단순하기 때문에 이것이 확실 하지 않습니다.

답변:


26

스레드는 프로세스에서 없어서는 안될 부분이므로 외부에서 종료 할 수 없습니다. 거기에 있습니다 pthread_kill은의 기능을하지만, 그것은 단지 스레드 자체의 맥락에서 적용됩니다. 링크의 문서에서 :

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


+1. 여기에 추가하십시오. 프로세스 내에서 pthread_kill ()을 사용하여 개별 스레드에 신호를 보낼 수 있습니다. 신호 처리기를 추가 할 수 있습니다.
Hemant

@hemant : MS Word가 맞춤법 검사를 위해 별도의 스레드를 사용한다고 가정합니다. 그 스레드를 죽이는 것은 그렇게 설계되지 않은 한 모든 것을 무너 뜨리지 않아야합니다. 이러한 상황에서 프로세스가 해당 스레드없이 존재할 수없는 이유는 무엇입니까?
Lazer

1
글쎄, 스레딩 모델을 부모 프로세스와 독립적으로 설계 할 수 있다고 가정하지만 외부 프로세스가 프로세스 내 스레드를 죽일 수는 있지만 보안, 프로세스 관리 및 시스템 무결성과 관련하여 웜을 열 수 있다고 가정합니다. 어떤 시스템 디자이너도 기꺼이 자신을 제출할 것이라고 생각하지 않습니다. 쓰레딩은 그런 종류의 두통이 없다면 충분히 어렵습니다. 내부에서 스레드를 종료하는 것은 문제가 발생하지 않고 자동 또는 다른 방식으로 종료 될 수있는 경우 책임이있는 상위 프로세스에 의해 작업이 수행되므로 문제가되지 않습니다.
gvkv

"그런 식으로 설계되지 않은 경우": 스레드를 사용하는 주된 이유는 리소스를 공유 할 수 있도록하는 것입니다. 오히려 집 절반을 쓰러 뜨리는 것과 같습니다.
pjc50

2
@Lazer, 입력 중이므로 다른 스레드가 텍스트를 업데이트하는 것과 동시에 한 스레드에서 맞춤법을 검사 할 수 없습니다. 이 때문에 백그라운드 맞춤법 검사 스레드를 사용하려면 다른 스레드가 텍스트를 변경하지 못하도록 잠금을 잡고 일부 단어를 복사 한 다음 잠금을 해제 한 다음 복사 된 단어를 확인해야합니다. 배경. 잠금을 유지 한 상태에서 강제 종료 한 경우 입력하려고하면 다른 스레드가 중단됩니다. 멀티 스레드 응용 프로그램은 이와 같은 상호 종속성으로 가득합니다.
psusi

6

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


그리고 커맨드 라인에서 다른 신호를 보내는 것은 어떻습니까?
yucer

@ yucer 나는 당신이 무엇을 요구하는지 이해하지 못합니다.
David Schwartz

"kill -l"로 표시된 목록에서 다른 신호를 보내는 것을 의미합니다. 특정 스레드에서 스택 추적을 덤프하여 수행중인 작업을 확인하는 방법을 찾고 있습니다.
yucer

@yucer 플랫폼에 따라 다릅니다. 일부는 특정 스레드가 스택을 덤프하도록 명령하는 방법을 제공합니다. 개인적으로 스크립트를 사용 gdb하여 프로세스에 디버거 (예 :)를 연결하고 스택에 덤프 할 모든 스레드를 명령 한 다음 분리 하는 것이 더 쉽다는 것을 알았습니다 .
David Schwartz

1

@gkv의 답변 외에도의 pthread_cancel(3)일부 기능을 살펴볼 수 있습니다 <pthread.h>. 매뉴얼 페이지에서 :

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


1

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

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


이것은 스레드에 신호를 보내는 방법이 아니라 스레드를 죽이는 방법에 관한 질문을 다루지 않습니다.
David Schwartz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.