TIL 231016

geon·2023년 10월 16일
0

CSAPP (p.792 ~ 811)

Signals

시그널의 개념

특정 타입의 이벤트가 발생했음을 프로세스에게 알리는 작은 메시지
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로 선언하자.

profile
뭐라도 적기

0개의 댓글