Ctrl-C와 SIGINT의 차이점은 무엇입니까?
-
28-10-2019 - |
문제
KeyboardInterrupt
예외를 수신 한 후 segfault가 발생하는 Python 프로그램을 디버깅하고 있습니다. 일반적으로 셸에서 Ctrl + C 를 눌러 수행합니다. 특정 코드 변경으로 버그가 수정되었는지 테스트하기 위해 시작 후 임의의 시간에 프로그램에 SIGINT
를 보내는 작은 쉘 스크립트가있었습니다. 내가 가진 문제는 Ctrl + C 를 보내는 것이 신호 생성 태그 코드를 보내는 것과 프로그램에 다른 영향을 미치는 것처럼 보이므로 버그가 나타나지 않으므로 차이점이 무엇인지 궁금합니다. 두 액션 사이.
이 프로그램은 키보드 동작을 전혀 포착하지 않으며 일부 스레드 / 프로세스가 포함 된 Python 프로그램입니다. 시그널 핸들러를 설치하지 않고 (Python은 설치하지만) SIGINT
는 stty -a
를 제공합니다. 나는 Ctrl + C 가 모든 하위 프로세스 / 스레드에 intr = ^C
를 보내는 반면 SIGINT
는 기본 프로세스에만 보내는 것이 아닐까 생각합니다.하지만 그것은 내 의심이가는만큼입니다.
여기에 kill -INT
를 보내는 쉘 스크립트가 있습니다.
라코 디스
해결책
^C
는 포 그라운드 프로세스 그룹의 모든 프로세스에 SIGINT
를 보냅니다.kill
로 동일한 작업을 수행하려면 신호를 프로세스 그룹 (OS 수준 개념)으로 보내야합니다.
라코 디스
또는 작업 (셸 수준 개념, 파이프 라인은 &
로 끝남) :
라코 디스
다른 팁
여기에 설명 : <인용구>
Python은 기본적으로 소수의 신호 처리기를 설치합니다. SIGPIPE 무시됩니다 (따라서 파이프 및 소켓의 쓰기 오류는 다음과 같이보고 될 수 있습니다. 일반 Python 예외) 및 SIGINT는 KeyboardInterrupt 예외입니다.이 모든 것을 무시할 수 있습니다.
따라서 SIGINT 전송과 Ctrl + c 사이의 동작은 동일해야합니다.
하지만 코드 어딘가에있는 경우 KeyboardInterrupt
에주의해야합니다.
라코 디스
KeyboardInterrupt 예외를 "먹습니다".