리눅스의 프로세스에서 개별 스레드를 죽이는 방법?


13

여기에 이미지 설명을 입력하십시오

이들은 패킷 수신기 프로세스의 개별 스레드입니다. 개별 스레드를 죽일 방법이 있습니까? Linux는 프로세스에서 특정 스레드로 중지 신호를 중지하거나 보낼 수있는 특정 명령을 제공합니까?


Packet Reciever 프로그램은 무엇입니까? (데비안 데스크탑에는 없습니다.) 더 많은 정보를 알려주세요. 따라서 개선하기 위해 질문편집하십시오 .
Basile Starynkevitch

1
어떤 스레드로 전송하든 "중지"신호가 프로세스를 중지한다는 것을 인식하지 못한다고 생각합니다.
David Schwartz의

1
GDB로 연결하고 스레드 를 종료 한 다음 분리하십시오.
Martin

1
@ Md.Kawsaruzzaman 그저 작동하지 않습니다. 예를 들어, 스레드가 메모리 할당 중이고 메모리 할당 자에 대한 잠금을 보유한다고 가정하십시오. 스레드를 중지하면 잠금이 해제되지 않으며 다른 스레드도 중지됩니다. 당신이 무엇을하려고하는지, 이것은 그것을하는 방법이 아닙니다. 스레드가 수행중인 작업을 중지하고 싶을 수도 있습니다. 그러나이를 수행하려면 프로세스의 협력이 필요합니다.이를 수행 할 방법이 없으면 수행 할 수 없습니다.
David 슈워츠

1
또한 스크린 샷에서 모든 "스레드"에는 별도의 PID가 있습니다. 신호가 프로세스로만 전송 될 수 있으므로 별도의 스레드를 대상으로 할 수도 있습니다.
szalski

답변:


16

더 큰 프로세스에서 개별 스레드를 종료하는 것은 일반적으로 매우 위험합니다. 그 스레드는 :

  • 손상 될 수있는 다른 스레드와 일부 공유 상태를 수정하십시오.
  • 풀리지 않는 잠금 장치를 잡고 잠금 장치를 무한정 사용할 수 없게하십시오.
  • ... 또는 다른 스레드가 잘못 될 수있는 다른 많은 것들.

일반적으로 응용 프로그램 자체의 관리 및 동기화 외부에서 개별 스레드를 종료하는 것은 의미가 없습니다.


5
이것은 전혀 유용하지 않습니다. OP는 스레드를 죽여야하는지 여부가 아니라 스레드 를 종료 하는 방법 을 묻고 있습니다.
Martin

내가 원하는 것은 특정 목적을 위해 특정 스레드를 종료하거나 중지하는 프로세스입니다. 일부 오류로 인해 때로는 수신기가 자동으로 종료되는 것으로 가정합니다. 자체 R & D에 의해 프로그램이 개발됨에 따라 원인을 찾고 있습니다. 이제 일부 스레드가 자동으로 종료 될 수 있습니다. 우리는 코드 측면에서 테스트를
해왔고

12

당신은 사용할 수 tgkill (2) 또는 tkill당신의 C 프로그램은 (당신이 사용해야합니다 콜 (2) )하지만 당신은하고 싶지 않아 . 프로그램 내부에서 pthread_kill (3)을 사용할 수 있습니다 . 거의 유용하지 않습니다.

(I 정확히 효과가있을 것 모르는 tgkilltkill- 예를와 SIGKILLSIGTERM- 스레드에)

의 pthreads (7) 라이브러리를 사용하는 낮은 수준의 물건 (일부를 포함하는 신호 (7) -s와 퓨 텍스 (7) -s 등 ...;도 참조 NPTL (7) ) 그리고 만약 당신-원시 사망 (과 tkill또는 tgkill) 일부 내부 스레드 가 손상 되어 프로세스가 잘못된 상태 ( 정의되지 않은 동작 )에있을 것입니다.

따라서 패킷 수신기 프로그램의 설명서를 연구하고 다른 방법을 찾으십시오. 무료 소프트웨어 인 경우 소스 코드를 연구하고 개선하십시오.

signal (7)signal-safety (7)을 자세히 읽으십시오 . 신호는 프로세스 ( kill (2)에 의해)로 보내 지고 스레드에서 처리됩니다.

실제로 신호와 스레드는 잘 결혼하지 않습니다. pthread 튜토리얼을 읽어보십시오 .

멀티 스레드 프로그램을 코딩 할 때 (와 같은 외부 신호 를 처리하려는 경우) 일반적인 트릭 SIGTERM파이프 (7) 를 자신의 프로세스에 사용하고 해당 파이프를 다른 스레드에서 폴링 (2) 하는 것입니다 (Linux도 고려할 수 있음) 특정 신호 fd (2) ), 신호 처리기 write (2) -바이트 또는 몇 바이트를 해당 파이프에 연결합니다. 잘 알려진 트릭은 Qt 문서에 잘 설명되어 있습니다 (Qt가 없어도 자신의 프로그램에서 사용할 수 있습니다).


4
tgkill함수는 스레드를 종료하는 방법을 제공하지 않습니다. 스레드에 신호를 보냅니다. 프로세스를 종료하는 역사적 방법이므로 스레드를 종료하는 데 사용할 수 없기 때문에 "kill"이라고합니다.
David Schwartz

SIGKILL스레드에 보내는 것이 해를 끼치는 것 같습니다. 아니면 항상 전체 프로세스를 중단합니까? 그리고 SIGTERM어때요? BTW는 스레드 만 손상 되더라도 프로세스가 심각한 상태라는 것입니다.
Basile Starynkevitch 님이

5
예, SIGKILLSIGTERM신호는 프로세스를 종료하거나 종료하도록 정의됩니다. 스레드가 어떤 스레드를 수신하든 관계없이 마찬가지입니다. 여전히 동일한 것을 의미합니다. 프로세스의 긴밀한 협력없이 스레드를 종료하면 문제가 발생하고 프로세스에 치명적일 수 있습니다.
David Schwartz의
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.