파이썬에는 숫자 형태의 시그널 번호를 통해 해당 시그널의 이름을 바로 조회하는 전용 함수가 제공되지 않습니다. 하지만 signal 모듈의 내부 속성들을 활용하면 충분히 구현할 수 있습니다.
핵심 아이디어는 다음과 같습니다. 먼저 signal.__dict__를 사용해 signal 모듈의 모든 속성을 가져온 후, 이름이 SIG로 시작하는 항목만 필터링합니다. 이때 SIG_로 시작하는 상수는 제외해야 원하는 시그널 이름만 깔끔하게 남길 수 있습니다. 마지막으로 필터링된 결과를 키와 값을 뒤집어 딕셔너리에 저장하면, 시그널 번호를 키로 삼아 이름을 쉽게 찾을 수 있는 매핑 테이블이 완성됩니다.
예제 코드
import signal
sig_items = reversed(sorted(signal.__dict__.items()))
final = dict((k, v) for v, k in sig_items if v.startswith('SIG') and not v.startswith('SIG_'))
print(final)위 코드에서 sorted()와 reversed()를 조합한 이유는, 동일한 값에 여러 이름이 연결된 경우 나중에 정의된 이름이 우선하도록 처리 순서를 조정하기 위함입니다.
실행 결과
위 코드를 실행하면 다음과 같이 시그널 객체를 키로, 시그널 이름을 값으로 가지는 딕셔너리가 출력됩니다:
{<Signals.SIGTERM: 15>: 'SIGTERM', <Signals.SIGSEGV: 11>: 'SIGSEGV',
<Signals.SIGINT: 2>: 'SIGINT', <Signals.SIGILL: 4>: 'SIGILL',
<Signals.SIGFPE: 8>: 'SIGFPE', <Signals.SIGBREAK: 21>: 'SIGBREAK',
<Signals.SIGABRT: 22>: 'SIGABRT'}이렇게 만든 딕셔너리를 활용하면 예를 들어 final[2]처럼 시그널 번호만으로도 'SIGINT'와 같은 이름을 즉시 얻을 수 있어, 시그널 핸들러 로깅이나 디버깅 작업에 유용하게 사용할 수 있습니다.