C signal handling
표준 라이브러리에서 시그널 처리(signal processing)는 프로그램이 실행 중에 다양한 시그널들을 어떻게 처리하는지를 정의한다. 시그널은 프로그램 내에서 몇몇 예외적인 행위(0으로 나누기 같은)를 보고하거나, 프로그램 외부의 비동기적 이벤트(키보드 키를 누르기 같은)를 보고할 수 있다.
SIGABRT
비정상적인 종료, JVM에서는 오류를 발견할 때마다 JVM이 발생 시키는 시그널.
- 메모리 할당이 안 된 메모리에 접근. 주로 malloc이 안 되어 발생.
- 예외 처리를 위해 정상적으로 사용하는 경우. Crash가 아니라 예외 처리로 발생하는 것.
SIGTERM
- 프로세스를 중지 시키는 안전한 방법이다. (Gracefully kills the process)
- 프로세스가 신호 감지할 수 있으며 (Can be handled)
- 무시(ignored) 가능하며
- 블록(blocked) 가능합니다.
- 인터럽트 할 수 없는 작업의 중간에 있다면 프로세스는 SIGTERM 신호를 무시할 수도 있다.
- Linux 에서 시그널 ID는
15
번 이며, kill 명령의 기본 값 이다. - SIGTERM은 자식 프로세스를 죽이지 않습니다.
SIGKILL
- 이것은 "네가 무슨 일을 하든 상관하지 않는다. 지금 바로 중단하라"는 신호다.
- 신호가 감지되면 프로세스는 즉시 중단된다.
- 커널에서 처리되며, 프로세스가 감지할 수 없다. (Cannot be handled or blocked)
- Linux 에서 시그널 ID는
9
번 이다. - SIGKILL은 자식 프로세스도 죽입니다.
SIGKILL vs SIGTERM
C signal handling#SIGKILL vs SIGTERM 항목 참조.
- Unix / Linux 의 kill 명령어 - 9번(SIGKILL)과 15번(SIGTERM)의 차이
- 시그널이란? 시그널(SIGNAL) 종류, 상황, 유사 시그널 차이점
- [추천] What is SIGTERM? What's the difference between SIGKILL & SIGTERM?
- [추천] Termination Signals (The GNU C Library)
이 두 신호 모두 프로세스를 종료하는 데 사용되지만 둘 사이에는 몇 가지 차이점이 있습니다. SIGKILL보다 SIGTERM을 선호해야 하는 이유는 다음과 같습니다:
- SIGTERM은 프로세스를 정상적으로 종료하는 반면 SIGKILL은 프로세스를 즉시 종료합니다.
- SIGTERM 신호는 처리, 무시 및 차단할 수 있지만 SIGKILL은 처리하거나 차단할 수 없습니다.
- SIGTERM은 자식 프로세스를 죽이지 않습니다. SIGKILL은 자식 프로세스도 죽입니다.
See also
- csignal
- std::atomic_signal_fence
- std::memory_order
- See
/usr/include/bits/signum.h
- kill: sample code:
kill -l
- 고아 프로세스 (Orphan process)
- 좀비 프로세스 (Zombie process)
- Signal (IPC) (Unix Signal)