특정 타입의 이벤트가 발생했음을 프로세스에게 알리는 작은 메시지
SIGFPE, SIGSEGV, SIGINT, SIGKILL, SIGCHLD 등이 있음
보내고 받는 2단계로 이루어짐
보내기
커널은 목적지 프로세스의 컨텍스트 내 상태를 변경함으로써 시그널을 전달함
커널이 시스템 내 이벤트를 탐지했을 때나 프로세스가 kill
함수를 호출한 경우 시그널이 전달됨
받기
목적지 프로세스는 전달된 시그널에 대해 대응하도록 커널에 의해 강제됨
프로세스틑 시그널을 무시하거나, 종료하거나, 시그널 핸들러를 실행해서 시그널을 잡을 수 있음
시그널 핸들러는 main 프로그램과 동시에 실행되기 때문에 같은 글로벌 자료구조에 접근하면 동시성 이슈가 발생하고 이러한 이슈는 디버깅하기 어려움
이를 예방하기 위한 가이드라인은 다음과 같음
G0. 핸들러를 최대한 간단하게 만들자
G1. 핸들러 내에서는 async-signal-safe 함수만 호출하자
async-signal-safe
함수는 재진입성이 있거나 시그널 핸들러에 의해 인터럽트 되지 않으므로 시그널 핸들러에 의해 안전하게 호출될 수 있음
G2. errno를 저장해 두었다가 복구하자.
G3. 모든 시그널을 차단함으로써 공유 자료구조에 대한 접근을 보호하자.
G4. 글로벌 변수를 volatile로 선언하자
volatile
키워드를 사용하면 해당 변수를 참조할 때 항상 메모리에서 읽고 메모리에 쓰도록 함
G5. 플래그를 sig_atomic_t로 선언하자.