#38 기본 시그널 처리 2
시그널 처리 설정
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 리턴