표준 라이브러리 헤더 <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>에서 확인해요.