문제

KeyboardInterrupt 예외를 수신 한 후 segfault가 발생하는 Python 프로그램을 디버깅하고 있습니다. 일반적으로 셸에서 Ctrl + C 를 눌러 수행합니다. 특정 코드 변경으로 버그가 수정되었는지 테스트하기 위해 시작 후 임의의 시간에 프로그램에 SIGINT를 보내는 작은 쉘 스크립트가있었습니다. 내가 가진 문제는 Ctrl + C 를 보내는 것이 신호 생성 태그 코드를 보내는 것과 프로그램에 다른 영향을 미치는 것처럼 보이므로 버그가 나타나지 않으므로 차이점이 무엇인지 궁금합니다. 두 액션 사이.

이 프로그램은 키보드 동작을 전혀 포착하지 않으며 일부 스레드 / 프로세스가 포함 된 Python 프로그램입니다. 시그널 핸들러를 설치하지 않고 (Python은 설치하지만) SIGINTstty -a를 제공합니다. 나는 Ctrl + C 가 모든 하위 프로세스 / 스레드에 intr = ^C를 보내는 반면 SIGINT는 기본 프로세스에만 보내는 것이 아닐까 생각합니다.하지만 그것은 내 의심이가는만큼입니다.

여기에 kill -INT를 보내는 쉘 스크립트가 있습니다. 라코 디스

도움이 되었습니까?

해결책

^C는 포 그라운드 프로세스 그룹의 모든 프로세스에 SIGINT를 보냅니다.kill로 동일한 작업을 수행하려면 신호를 프로세스 그룹 (OS 수준 개념)으로 보내야합니다. 라코 디스

또는 작업 (셸 수준 개념, 파이프 라인은 &로 끝남) : 라코 디스

다른 팁

여기에 설명 : <인용구>

Python은 기본적으로 소수의 신호 처리기를 설치합니다. SIGPIPE 무시됩니다 (따라서 파이프 및 소켓의 쓰기 오류는 다음과 같이보고 될 수 있습니다. 일반 Python 예외) 및 SIGINT는 KeyboardInterrupt 예외입니다.이 모든 것을 무시할 수 있습니다.

따라서 SIGINT 전송과 Ctrl + c 사이의 동작은 동일해야합니다.

하지만 코드 어딘가에있는 경우 KeyboardInterrupt에주의해야합니다. 라코 디스

KeyboardInterrupt 예외를 "먹습니다".

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top