Linux의 프로세스에서 단일 스레드를 종료하는 방법은 무엇입니까?

Linux의 프로세스에서 단일 스레드를 종료하는 방법은 무엇입니까?

여기에 이미지 설명을 입력하세요.

이는 패킷 수신자 프로세스의 개별 스레드입니다. 단일 스레드를 종료하는 방법이 있습니까? Linux는 프로세스 아래의 특정 스레드를 종료하거나 프로세스 아래의 특정 스레드에 중지 신호를 보내는 특정 명령을 제공합니까?

답변1

더 큰 프로세스에서 단일 스레드를 종료하는 것은 종종 매우 위험합니다. 이 스레드는 다음을 수행할 수 있습니다.

  • 다른 스레드와 공유되는 일부 손상되었을 수 있는 상태 수정
  • 절대로 해제되지 않는 일부 잠금을 보유하여 잠금을 무기한 사용할 수 없게 만듭니다.
  • ...또는 다른 스레드에 오류를 일으킬 수 있는 기타 모든 것.

일반적으로 애플리케이션 자체의 관리 및 동기화를 제외하고 개별 스레드를 종료하는 것은 의미가 없습니다.

답변2

당신은 사용할 수 있습니다tgkill(2)또는 tkillC 프로그램에서(다음을 사용해야 합니다.시스템 호출(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

SIGKILLSIGSYS전송하는 대신(예 : ) 사용되지 않고 차단/무시되지 않는 다른 신호에 대한 핸들러를 설치할 수 있습니다. 이 핸들러에서는 일반 또는 함수와 달리 현재 스레드(LWP)만 종료하는 시스템 호출을 호출할 수 있습니다. syscall(SYS_exit, 0)전체 프로세스는 시스템 호출로 종료됩니다.exit(int)_exit(int)exitexit_group

pthread_exit(...)시스템 호출 대신 호출을 고려할 수도 있지만 이 함수는 비동기적으로 안전하지 않으므로 호출하면 프로세스에서 세그폴트가 발생할 수 있습니다.

강제 종료 스레드에 대한 다른 답변의 모든 경고가 적용됩니다.

관련 정보