ARM Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

200239
1625
172597


[리눅스커널] 시그널: 유저 공간 suspend() 함수 분석하기 12. 시그널

sigsuspend() 함수는 다음 동작을 한번에 수행합니다.
1. 시그널 블록을 설정
2. 시그널이 도착할 때까지 기다림

sigsuspend() 함수 동작을 다른 코드로 표현하면 다음과 같습니다.
   sigprocmask( SIG_SETMASK, &sert, NULL);
   pause();

그런데 위 코드와 같이 구현을 했다면 문제가 발생할 수 있습니다. 그 이유는 다음과 같습니다. 

    sigprocmask() 함수와 pause() 함수 호출 사이에도 시그널이 발생할 수 있다. 

sigprocmask() 함수를 처리하는 도중에 발생한 시그널은 처리되지 않는 것입니다. 한 가지 예를 들어 볼까요? 여러분이 ‘Ctrl+C’ 키를 한 번만 누르면 터미널 프로그램이 종료돼야 하는데 가끔 여러 번 눌러야 프로그램이 종료될 때가 있습니다. 

    그렇다면 어떻게 해야 시그널을 놓치는 일을 방지할 수 있을까?

블록 설정과 동시에 시그널 도착을 바로 확인해야 시그널을 잃어 버리는 일이 없을 것입니다. 이렇게 블록 설정과 함께 시그널을 대기하는 기능은 sigsuspend() 함수가 수행합니다.

이제 함수 선언부와 인자를 점검해 볼까요?
int sigsuspend(const sigset_t *mask);

인자는 다음과 같습니다.
sigset_t *mask: 블록될 시그널 집합

sigset_t로 설정한 시그널을 블록하고 시그널 전달을 기다립니다. 이 점이 pause() 함수와 다른 점입니다.

#Referene 시그널
시그널이란
시그널 설정은 어떻게 할까
시그널 생성 과정 함수 분석
프로세스는 언제 시그널을 받을까
시그널 전달과 처리는 어떻게 할까?
시그널 제어 suspend() 함수 분석 
시그널 ftrace 디버깅

"혹시 궁금점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답글 올려드리겠습니다!" 



핑백

덧글

댓글 입력 영역