📻 minitalk

❓minitalk (0) 개요

❓minitalk (1) 허용 함수

❓minitalk (2) 선행 지식

❓minitalk (3) 시그널 구조

❓minitalk (5) 통신 관련 용어 및 기술

안전한 시그널 사용을 위한 수칙


시그널 핸들러는 비동기 작업을 지원하기 때문에 데이터 레이스가 자주 발생하며, 다양한 원인과 증상이 존재한다.

시그널 핸들러는 가능한 간단하게 유지해야 한다.

문제점

리눅스 시스템은 같은 유형의 시그널이 이미 보류 중일 경우 시그널을 대기열에 넣지 않는다.

보류 시그널은 일종의 플래그 처럼 동작하며 SIGUSR1이 연속 3번 전달되었다고 가정할 때의 슈도 코드는 다음과 같다.

  1. 시그널을 처리한다.

  2. 시그널을 처리 중이므로 대기열에 SIGUSR1을 넣는다.

    pending[SIGUSR1] = 1;
    
  3. 시그널을 처리 중이므로 대기열에 SIGUSR1을 넣는다. (누락 발생!)

    pending[SIGUSR1] = 1; // 덮어씌워지므로 누락 발생 
    
  4. (1)에서의 시그널 처리가 끝나 보류 중인 시그널을 가져온다.

    pending[SIGUSR1] = 0;
    

즉, 시그널 핸들러의 수행 시간이 길어질수록 누락되는 시그널이 많아지게 된다.

해결방법