POSIX 시그널(Signal)은 유닉스/리눅스에서 프로세스에 비동기적으로 알림을 전달하는 소프트웨어 인터럽트 메커니즘이다. 키보드 인터럽트(Ctrl+C), 프로세스 종료, 타이머, 자식 프로세스 종료 등을 처리한다.
주요 시그널
| 시그널 | 번호 | 기본 동작 | 트리거 |
|---|
| SIGTERM | 15 | 종료 | kill 명령 |
| SIGKILL | 9 | 강제 종료 | kill -9, 차단 불가 |
| SIGINT | 2 | 종료 | Ctrl+C |
| SIGHUP | 1 | 종료 | 터미널 연결 끊김 |
| SIGCHLD | 17 | 무시 | 자식 프로세스 종료 |
| SIGALRM | 14 | 종료 | alarm() 타이머 |
| SIGUSR1/2 | 10/12 | 종료 | 사용자 정의 |
| SIGSEGV | 11 | 코어 덤프 | 잘못된 메모리 접근 |
시그널 핸들러 등록
python
import signal
import sys
def graceful_shutdown(signum, frame):
print("Shutting down gracefully...")
# 자원 정리, 연결 종료 등
sys.exit(0)
signal.signal(signal.SIGTERM, graceful_shutdown)
signal.signal(signal.SIGINT, graceful_shutdown)
# SIGHUP으로 설정 파일 재로드
def reload_config(signum, frame):
global config
config = load_config()
print("Config reloaded")
signal.signal(signal.SIGHUP, reload_config)
시그널 마스킹
c
// 시그널 임시 차단 (임계 구역 보호)
sigset_t mask, oldmask;
sigemptyset(&mask);
sigaddset(&mask, SIGTERM);
sigprocmask(SIG_BLOCK, &mask, &oldmask);
// ... 임계 구역 ...
sigprocmask(SIG_SETMASK, &oldmask, NULL);
도커 컨테이너와 SIGTERM
컨테이너 종료 시 PID 1에 SIGTERM이 전달된다. 셸 스크립트가 PID 1이면 자식 프로세스에 시그널이 전달되지 않을 수 있어 exec 명령 사용이 권장된다.
관련 개념
- •프로세스와 스레드 — 시그널을 받는 단위
- •인터럽트 — 하드웨어 인터럽트와의 유사성
- •IPC — 시그널도 프로세스 간 통신의 일종
- •커널 — 시그널 전달을 담당하는 OS 핵심