표준 라이브러리 헤더 <signal.h>
표준 라이브러리 헤더 <signal.h>
프로그램이 실행되는 동안 Ctrl+C 같은 신호가 오거나, 잘못된 메모리 접근 같은 하드웨어 예외가 생길 수 있어요. 이런 **신호(signal)**를 기본 동작에 맡기지 않고 직접 처리하고 싶을 때가 있죠. <signal.h>는 프로그램 지원 라이브러리의 일부로, 신호를 정의하고 신호 처리기(handler)를 설정·발생시키는 도구를 제공해요.
출처: cppreference
본문
타입(Types)
| 타입 | 설명 |
|---|---|
sig_atomic_t |
비동기 신호 처리기에서 원자적 개체로 접근할 수 있는 정수 타입 |
매크로(Macros)
| 매크로 | 설명 |
|---|---|
SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV, SIGTERM |
신호의 종류를 정의 |
SIG_DFL, SIG_IGN |
신호 처리 전략(기본 처리, 무시)을 정의 |
SIG_ERR |
오류가 발생했음을 나타냄 |
함수(Functions)
| 함수 | 설명 |
|---|---|
signal |
특정 신호에 대한 신호 처리기를 설정 |
raise |
특정 신호에 대한 신호 처리기를 실행 |
시그니처(Synopsis)
typedef sig_atomic_t /* see description */;
void (*signal(int sig, void (*func)(int)))(int);
int raise(int sig);
#define SIG_DFL /* see description */
#define SIG_ERR /* see description */
#define SIG_IGN /* see description */
#define SIGABRT /* see description */
#define SIGFPE /* see description */
#define SIGILL /* see description */
#define SIGINT /* see description */
#define SIGSEGV /* see description */
#define SIGTERM /* see description */
signal의 반환 타입인 void (*)(int)가 다소 복잡해 보이는데, "int를 받아 void를 돌려주는 함수 포인터"를 반환한다는 뜻이에요. 즉 이전에 설정돼 있던 처리기를 돌려주죠. 처리 함수는 int 시그널 번호를 받아요. SIG_DFL을 주면 기본 처리로, SIG_IGN을 주면 신호를 무시해요.
신호 처리기 안에서는 아주 제한된 일만 안전하게 할 수 있어요. sig_atomic_t 타입의 volatile 변수에 값을 쓰거나, stdatomic 함수나 signal/raise를 호출하는 정도가 대표적이에요. 그 외의 대부분의 라이브러리 함수 호출은 미정의 동작이 될 수 있어요.
더 알아보기
- 신호 처리기에서 원자성을 보장하는
sig_atomic_t의 의미는<stdatomic.h>와 함께 보면 좋아요. - 프로세스 종료·환경 처리 같은 프로그램 지원 도구는
<stdlib.h>에서 확인해요.