이들은 패킷 수신기 프로세스의 개별 스레드입니다. 개별 스레드를 죽일 방법이 있습니까? Linux는 프로세스에서 특정 스레드로 중지 신호를 중지하거나 보낼 수있는 특정 명령을 제공합니까?
이들은 패킷 수신기 프로세스의 개별 스레드입니다. 개별 스레드를 죽일 방법이 있습니까? Linux는 프로세스에서 특정 스레드로 중지 신호를 중지하거나 보낼 수있는 특정 명령을 제공합니까?
답변:
더 큰 프로세스에서 개별 스레드를 종료하는 것은 일반적으로 매우 위험합니다. 그 스레드는 :
일반적으로 응용 프로그램 자체의 관리 및 동기화 외부에서 개별 스레드를 종료하는 것은 의미가 없습니다.
당신은 사용할 수 tgkill (2) 또는 tkill
당신의 C 프로그램은 (당신이 사용해야합니다 콜 (2) )하지만 당신은하고 싶지 않아 . 프로그램 내부에서 pthread_kill (3)을 사용할 수 있습니다 . 거의 유용하지 않습니다.
(I 정확히 효과가있을 것 모르는 tgkill
나 tkill
- 예를와 SIGKILL
나 SIGTERM
- 스레드에)
의 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가 없어도 자신의 프로그램에서 사용할 수 있습니다).
tgkill
함수는 스레드를 종료하는 방법을 제공하지 않습니다. 스레드에 신호를 보냅니다. 프로세스를 종료하는 역사적 방법이므로 스레드를 종료하는 데 사용할 수 없기 때문에 "kill"이라고합니다.
SIGKILL
스레드에 보내는 것이 해를 끼치는 것 같습니다. 아니면 항상 전체 프로세스를 중단합니까? 그리고 SIGTERM
어때요? BTW는 스레드 만 손상 되더라도 프로세스가 심각한 상태라는 것입니다.
SIGKILL
및 SIGTERM
신호는 프로세스를 종료하거나 종료하도록 정의됩니다. 스레드가 어떤 스레드를 수신하든 관계없이 마찬가지입니다. 여전히 동일한 것을 의미합니다. 프로세스의 긴밀한 협력없이 스레드를 종료하면 문제가 발생하고 프로세스에 치명적일 수 있습니다.