Computer Security

#38 기본 시그널 처리 2 본문

리눅스 시스템 프로그래밍

#38 기본 시그널 처리 2

쿠리 Kuri 2022. 10. 13. 18:30
반응형

시그널 처리 설정

typedef void (*sighandler_t) (int);
sighandler_t signal (int signum, sighandler_t handler);

파라미터

- signum : 처리 대상 시그널 번호

 

- handler : 시그널 핸들러

   - SIG_IGN : 해당 시그널을 무시 처리 한다.

   - SIG_DFL : 해당 시그널을 기본 동작 처리 한다.

   - 그외 사용자 정의 시그널 핸들러

 

 

 

반환 값

- 성공 시 이전 시그널 핸들러

 

- 실패 시 SIG_ERR

 

 

 

 

 

 


재진입성(reentrant)

 

Reentrant function

- 실행이 끝나기 전에 중단되었다가 재개 되엇을 때에도 정삭적으로 수행을 마치는 함수

 

 

 


시그널 핸들러와 reentrant와의 관계

- 시그널 핸들러가 호출되는 시점에 어떤 코드를 실행 중이었는지 알 수 없다.

- 특히, 재진입이 불가능한 API를 사용하면 데이터가 망가질 수 잇다.

 

 

 


그렇기에 시그널 핸들러는

- 재진입이 가능한 함수만 사용해야 한다.

- 글로벌 데이터를 수정할 때 조심해야 한다.

- 필요한 경우 시그널 블록 처리 -> 데이터 처리 -> 시그널 언블록 처리 하여 데이터를 안전하게 다뤄야 한다.

 

 

 

 

 

 


시그널 보내기

int kill (pid_t pid, int sig);

파라미터

- pid : 시그널 송신 대상 지정

   - 1 이상 : 프로세스 ID
   - 0 : 프로세스 그룹 전체

   - -1 : 권한 내의 모든 프로세스

   - -1 미만 : 프로세스 그룹 아이디가 (-pid)인 프로세스 그룹 전체

 

- sig : 보낼 시그널 번호

     - 단, 0인 경우 보내지는 않고, process 유무 및 권한 판단 수행

 

 

 

반환 값

- 하나 이상의 프로세스에게 송신 시 0 리턴

 

- 실패 시 -1

 

 

 

 

 


시그널 블록

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

파라미터

- how 

    - SIG_BLOCK : blocked signal에 추가

    - SIG_UNBLOCK : 현재 blocked signal에서 제외

    - SIG_SETMASK : set 변수를 blocked signal로 설정

 

- set : 설정할 sigset

 

- oldset : 기존 설정되어 있던 sigset

 

 

 

반환 값

- 성공 시 0

 

- 실패 시 -1

 

 

 

 

 

 

 


시그널 모음 설정

 

int sigemptyset (sigset_t *set);

- sigset 변수를 empty set으로 설정(아무런 시그널 설정되어 있지 않음)

 

 

int sigfillset (sigset_t *set);

- sigset 변수에 모든 시그널을 설정

 

 

int sigaddset (sigset_t *set, int signum);

- sigset 변수에 특정 시그널을 추가

 

 

int sigdelset (sigset_t *set, int signum);

- sigset 변수에서 특정 시그널을 삭제

 

 

int sigismember (const sigset_t *set, int signum);

- sigset 변수에서 특정 시그널이 포함되어 있는지 확인

- 포함시 1 리턴

 

 

반응형
Comments