답변1
더 큰 프로세스에서 단일 스레드를 종료하는 것은 종종 매우 위험합니다. 이 스레드는 다음을 수행할 수 있습니다.
- 다른 스레드와 공유되는 일부 손상되었을 수 있는 상태 수정
- 절대로 해제되지 않는 일부 잠금을 보유하여 잠금을 무기한 사용할 수 없게 만듭니다.
- ...또는 다른 스레드에 오류를 일으킬 수 있는 기타 모든 것.
일반적으로 애플리케이션 자체의 관리 및 동기화를 제외하고 개별 스레드를 종료하는 것은 의미가 없습니다.
답변2
당신은 사용할 수 있습니다tgkill(2)또는 tkill
C 프로그램에서(다음을 사용해야 합니다.시스템 호출(2)) 하지만당신이 원하지 않는. 프로그램 내에서 다음을 사용할 수 있습니다.pthread_kill(3)- 거의 유용하지 않습니다.
tgkill
( 예 tkill
를 들어 스레드에서 또는 스레드를 사용하는 등 의 영향이 무엇 SIGKILL
인지 전혀 모릅니다 )SIGTERM
이것병렬 스레드(7)라이브러리는 낮은 수준의 항목(일부 포함)을 사용합니다.신호(7)-모래미래섬유(7)-s 등... 살펴볼 수도 있습니다.NPTL(7)), 일부 개별 스레드를 원시 종료( tkill
또는 사용 tgkill
)하면 프로세스가 잘못된 상태가 됩니다(따라서정의되지 않은 동작) 일부 내부 불변성이 깨질 수 있기 때문입니다.
그러므로 패킷 수신자 프로그램의 문서를 연구하고 다른 방법을 찾으십시오. 의 경우무료 소프트웨어, 소스 코드를 연구하고 개선하세요.
주의 깊게 읽어보세요신호(7)그리고신호 보안(7). 신호는 (를 통해) 프로세스로 전송되도록 의도되었습니다.죽이다(2)) 스레드에서 처리됩니다.
실제로 신호와 스레드는 함께 잘 작동하지 않습니다. 좀 읽어봐스레딩 튜토리얼.
멀티스레드 프로그램을 작성할 때 흔히 사용되는 트릭입니다.외부)와 같은 신호가 SIGTERM
사용됩니다 .파이프(7)자신만의 프로세스와여론조사(2)파이프가 다른 스레드에 있습니다(Linux 특정을 고려할 수도 있습니다).signalfd(2)), 신호 처리기를 사용하여쓰기(2)- 이 파이프에 하나 이상의 바이트를 넣습니다. 이 잘 알려진 트릭은 다음에 잘 설명되어 있습니다.Qt 문서(Qt 없이도 자신의 프로그램에서 사용할 수 있습니다).
답변3
SIGKILL
SIGSYS
전송하는 대신(예 : ) 사용되지 않고 차단/무시되지 않는 다른 신호에 대한 핸들러를 설치할 수 있습니다. 이 핸들러에서는 일반 또는 함수와 달리 현재 스레드(LWP)만 종료하는 시스템 호출을 호출할 수 있습니다. syscall(SYS_exit, 0)
전체 프로세스는 시스템 호출로 종료됩니다.exit(int)
_exit(int)
exit
exit_group
pthread_exit(...)
시스템 호출 대신 호출을 고려할 수도 있지만 이 함수는 비동기적으로 안전하지 않으므로 호출하면 프로세스에서 세그폴트가 발생할 수 있습니다.
강제 종료 스레드에 대한 다른 답변의 모든 경고가 적용됩니다.