이 름
sigaction, sigprocmask, sigpending, sigsuspend − POSIX 시 그 널 처 리 함 수
사 용 법
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
int sigpending(sigset_t *set);
int sigsuspend(const sigset_t *mask);
설 명
sigaction 시 스 템 호 출 은 특 정 시 그 널 이 수 신 되 었 을 때 , 프 로 세 스 가 취 할 액 션 을 변 경 하 는 데 사 용 된 다 .
signum 는 시 그 널 을 가 리 키 며 , SIGKILL 과 SIGSTOP 를 제 외 한 모 든 시 그 널 값 이 될 수 있 다 .
act 가 null이 아 닐 때 , 시 그 널 signum 에 대 한 새 로 운 액 션 은 act 가 되 며 , oldact 이 null이 아 닐 때 , 기 존 의 액 션 은 oldact 에 저 장 된 다 .
sigaction 구 조 는 다 음 과 같 이 정 의 된 다 .
struct
sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
}
아 키 텍 쳐 에 따 라 공 용 체 로 되 어 있 기 도 하 므 로 , sa_handler 와 sa_sigaction 을 모 두 지 정 하 지 말 라 .
sa_restorer 요 소 는 쓰 이 지 않 으 며 , 사 용 되 어 서 는 안 된 다 . POSIX는 sa_restorer 요 소 를 갖 지 않 는 다 .
sa_handler 는 signum 시 그 널 이 오 면 실 행 되 는 액 션 을 명 시 하 며 , 디 폴 트 액 션 을 취 하 라 는 SIG_DFL , 시 그 널 을 무 시 하 라 는 SIG_IGN , 시 그 널 을 처 리 하 는 특 정 함 수 에 대 한 포 인 터 중 의 하 나 가 될 수 있 다 . 세 번 째 의 경 우 시 그 널 처 리 함 수 는 시 그 널 번 호 만 을 유 일 한 인 수 로 갖 는 다 .
sa_sigaction 또 한 signum 시 그 널 과 연 결 된 액 션 을 명 시 한 다 . 처 리 함 수 는 시 그 널 번 호 를 첫 번 째 인 수 로 , siginfo_t 에 대 한 포 인 터 를 두 번 째 인 수 로 , 그 리 고 void형 포 인 터 로 캐 스 트 된 ucontext_t 에 대 한 포 인 터 를 세 번 째 인 수 로 갖 는 다 .
sa_mask 는 시 그 널 핸 들 러 의 실 행 동 안 블 록 화 되 어 야 하 는 시 그 널 의 마 스 크 를 제 공 한 다 . 또 한 , SA_NODEFER 또 는 SA_NOMASK 이 사 용 되 지 않 으 면 , 핸 들 러 를 시 동 시 켰 던 그 시 그 널 도 블 록 화 된 다 .
sa_flags 는 시 그 널 처 리 프 로 세 스 의 행 위 를 변 경 시 키 는 일 련 의 플 래 그 들 을 명 시 한 다 . 이 는 bitwise 혹 은 플 래 그 는 아 래 플 래 그 들 의 0개 이 상 의 OR 비 트 연 산 으 로 만 들 어 진 다 .
SA_NOCLDSTOP
signum 가 SIGCHLD 이 면 자 식 프 로 세 스 가 중 지 되 어 도 통 지 를 받 지 않 는 다 . (즉 , 자 식 프 로 세 스 들 이 SIGSTOP, SIGTSTP, SIGTTIN , SIGTTOU 중 하 나 를 수 신 할 때 )
SA_ONESHOT 또 는 SA_RESETHAND
시 그 널 처 리 기 가 호 출 되 어 한 번 실 행 된 후 , 시 그 널 액 션 을 원 래 의 디 폴 트 액 션 으 로 되 돌 려 놓 는 다 . (이 는 signal(2) 호 출 에 대 한 기 본 행 위 이 다 .)
SA_RESTART
일 부 시 스 템 호 출 들 이 시 그 널 을 통 해 재 시 작 할 수 있 도 록 함 으 로 서 BSD 시 그 널 과 의 호 환 성 을 제 공 한 다 .
SA_NOMASK or SA_NODEFER
어 떤 시 그 널 처 리 기 의 동 작 동 안 그 시 그 널 자 신 을 막 지 않 는 다 .
SA_SIGINFO
시 그 널 처 리 기 가 한 개 가 아 닌 3개 의 인 수 를 취 한 다 . 이 경 우 , sa_handler 대 신 에 sa_sigaction 이 설 정 되 어 야 한 다 . (sa_sigaction 필 드 는 리 눅 스 2.1.86에 서 추 가 되 었 다 .)
sa_sigaction 의 siginfo_t 변 수 는 다 음 의 요 소 들 을 갖 는 구 조 체 (struct)이 다 .
siginfo_t {
int |
si_signo; | ||
/* 시 그 널 넘 버 */ | |||
int |
si_errno; | ||
/* errno 값 */ | |||
int |
si_code; | ||
/* 시 그 널 코 드 */ | |||
pid_t |
si_pid; | ||
/* 프 로 세 스 ID 보 내 기 */ | |||
uid_t |
si_uid; | ||
/* 프 로 세 스 를 전 송 하 는 실 제 사 용 자 ID */ | |||
int |
si_status; | ||
/* Exit 값 또 는 시 그 널 */ | |||
clock_t |
si_utime; | ||
/* 소 모 된 사 용 자 시 간 */ | |||
clock_t |
si_stime; | ||
/* 소 모 된 시 스 템 시 간 */ | |||
sigval_t |
si_value; | ||
/* 시 그 널 값 */ | |||
int |
si_int; | ||
/* POSIX.1b 시 그 널 */ | |||
void * |
si_ptr; | ||
/* POSIX.1b 시 그 널 */ | |||
void * |
si_addr; | ||
/* 실 패 를 초 래 한 메 모 리 위 치 */ | |||
int |
si_band; | ||
/* 밴 드 이 벤 트 */ | |||
int |
si_fd; | ||
/* 파 일 기 술 자 */ |
}
si_signo, si_errno 그 리 고 si_code 는 모 든 시 그 널 에 대 해 정 의 되 었 다 . kill(2), POSIX.1b 시 그 널 과 SIGCHLD은 si_pid 과 si_uid 을 채 운 다 . SIGCHLD 은 또 한 si_status, si_utime, si_stime 을 채 운 다 . si_int 그 리 고 si_ptr 는 POSIX.1b 시 그 널 의 송 신 자 에 의 해 명 시 된 다 . 좀 더 자 세 한 사 항 을 보 려 면 , sigqueue(2) 을 참 조 하 라 . SIGILL, SIGFPE, SIGSEGV 그 리 고 SIGBUS은 si_addr 를 오 류 의 주 소 로 채 운 다 . SIGPOLL 은 si_band와 si_fd 를 채 운 다 . si_code 는 왜 시 그 널 이 보 내 졌 는 지 에 대 해 지 시 한 다 . 이 는 bitmask가 아 닌 값 이 다 . 나 올 수 있 는 모 든 시 그 널 값 은 이 테 이 블 에 나 열 되 어 있 다 .
sigprocmask 호 출 은 현 재 블 록 화 된 시 그 널 들 을 변 경 시 키 는 데 사 용 된 다 . 호 출 은 지 정 된 how 값 에 따 라 다 르 게 동 작 한 다 .
SIG_BLOCK
set 인 수 가 지 정 한 시 그 널 집 합 이 블 록 시 킬 시 그 널 집 합 에 더 해 진 다 .
SIG_UNBLOCK
set 에 포 함 된 시 그 널 들 이 블 록 시 킬 시 그 널 들 의 집 합 에 서 삭 제 된 다 . 블 록 하 고 있 지 않 은 시 그 널 을 삭 제 하 려 해 도 괜 찮 다 .
SIG_SETMASK
블 록 화 할 시 그 널 집 합 을 set 으 로 설 정 한 다 .
oldset 이 null이 아 닐 때 , 기 존 의 마 스 크 시 그 널 집 합 은 oldset 에 저 장 된 다 .
sigpending 호 출 은 블 록 화 에 막 혀 기 다 리 고 있 는 시 그 널 을 살 펴 볼 수 있 도 록 해 준 다 . 기 다 리 는 시 그 널 들 의 시 그 널 마 스 크 는 set 내 에 저 장 된 다 .
sigsuspend 호 출 은 프 로 세 스 가 막 고 있 는 시 그 널 마 스 크 를 지 정 한 mask 로 잠 시 대 체 하 고 , 다 음 시 그 널 이 수 신 될 때 까 지 프 로 세 스 를 중 지 시 킨 다 .
반 환 값
sigaction , sigprocmask , sigpending 는 성 공 하 면 0을 실 패 하 면 -1을 리 턴 한 다 . sigsuspend 항 상 -1을 리 턴 한 다 . 보 통 에 러 EINTR 과 함 께 .
에 러
EINVAL |
지 정 한 시 그 널 이 부 적 절 하 다 . 혹 은 받 을 수 없 는 SIGKILL 또 는 SIGSTOP 에 대 한 액 션 을 변 경 하 려 고 했 다 . | ||
EFAULT |
act, oldact, set 또 는 oldset 이 프 로 세 스 의 메 모 리 영 역 이 아 닌 곳 을 가 리 키 고 있 다 . | ||
EINTR |
시 스 템 호 출 이 인 터 럽 트 되 었 다 . |
주 의
sigprocmask 호 출 로 SIGKILL 또 는 SIGSTOP 을 블 록 화 할 수 없 다 . 이 런 명 령 은 무 시 된 다 .
POSIX에 따 르 면 , 프 로 세 스 가 kill() 또 는 raise() 함 수 가 만 들 어 낸 것 이 아 닌 GFPE, SIGILL, 혹 은 SIGSEGV를 무 시 한 이 후 의 프 로 세 스 의 동 작 은 정 의 되 지 않 는 다 . 정 수 를 0으 로 나 눈 결 과 또 한 정 의 되 지 않 는 다 . 일 부 아 키 텍 쳐 에 선 0으 로 나 누 기 가 SIGFPE 시 그 널 을 만 들 어 낼 것 이 다 . (또 한 가 장 큰 음 의 정 수 를 −1로 나 누 어 도 SIGFPE를 생 성 할 수 있 다 .) 이 시 그 널 을 무 시 하 면 무 한 루 프 를 초 래 할 수 있 다 .
POSIX 스 펙 은 오 직 SA_NOCLDSTOP 만 을 정 의 한 다 . 다 른 sa_flags 의 사 용 은 이 식 이 불 가 능 하 다 .
SA_RESETHAND 플 래 그 는 동 일 한 이 름 의 SVr4 플 래 그 와 호 환 가 능 하 다 .
SA_NODEFER 플 래 그 는 커 널 1.3.9과 새 로 운 버 전 하 에 서 동 일 한 이 름 의 SVr4 플 래 그 와 호 환 가 능 하 다 .
SVr4 호 환 성 을 위 한 SA_RESETHAND 와 SA_NODEFER 이 름 들 은 오 직 라 이 브 러 리 버 전 3.0.9 그 리 고 그 이 후 의 버 전 에 서 만 존 재 한 다 .
SA_SIGINFO 플 래 그 는 POSIX.1b에 의 해 서 만 명 시 된 다 . 이 에 대 한 지 원 은 리 눅 스 2.2에 추 가 되 었 다 .
sigaction 현 재 시 그 널 처 리 기 에 쿼 리 를 하 기 위 해 널 두 번 째 인 수 로 호 출 될 수 있 다 . 이 를 널 두 번 째 그 리 고 세 번 째 인 수 들 로 이 를 호 출 함 으 로 서 현 재 머 신 에 대 한 주 어 진 시 그 널 이 타 당 한 가 를 체 크 하 는 데 사 용 될 수 있 다 .
시 그 널 체 계 조 작 에 대 한 자 세 한 정 보 를 얻 으 려 면 , sigsetops(3) 을 참 조 하 라 .
호 환
POSIX, SVr4. SVr4 는 EINTR 조 건 에 대 한 문 서 를 제 공 하 지 않 는 다 .
관 련 항 목
kill(1), kill(2), killpg(2), pause(2), raise(3), siginterrupt(3), signal(2), signal(7), sigsetops(3), sigvec(2)
번 역
ASPLINUX
<man [AT] asp-linux.kr> 2000년 7월
29일
한 글 Manpage 프 로 젝
트 (http://man.kldp.org) 2005년 2월
13일