'시그날'에 해당되는 글 1건
- 2010.01.21 sigaction
int sigaction (int signum, const struct sigaction *restrict action, struct sigaction *restrict old-action)
signum에 대한 action을 셋팅해준다 old-action은 셋팅하기전의 이전의 action이 반환된다.
action이 null일 경우에는 old-action을 통해서 현재 셋팅된 action에 대한 값을 얻어올수 있다.
struct sigaction {
sighandler_t sa_handler; // SIG_DFL, SIG_IGN, 함수포인터 가 될수 있다
sigset_t sa_mask; // handler가 실행될 동안 block되야하는 signal (기본적으로 block되므로 unblock하고 싶으면 조작해줘야함)
int sa_flags;
}
sa_flags:
SA_NOCLDSTOP : SIG_CHLD에만 의미가 있고 셋팅되어있으면 terminated child에 대해서만 signal을 보냄 (stop된것에는 보내지않음)
SA_ONSTACK : signal stack을 사용한다, 만약 sigaltstack()나 sigstack()를 통해서 다른 시그널 스택 영역을 할당해 놓았다면, 시그널들이 이 새로운 스택 영역으로 전달되게 한다.
SA_RESTART : open, read, write같은 함수 실행중 signal이 발생할경우 어떤식으로 할지 정한다 (이게 셋팅되어있으면 library함수를 재시작한다)
sigset_t : signal을 표현하고 있는 구조체 또는 정수로 선언됨 (signal.h)
bits/sigset.h
# define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int)))
typedef struct
{
unsigned long int __val[_SIGSET_NWORDS];
} __sigset_t;
========= sigset_t를 조작하거나 셋팅하는 함수 ============
int sigemptyset (sigset_t *set)
sigset_t에 모든 signal셋팅을 clear한다
int sigfillset (sigset_t *set)
sigset_t에 모든 signal셋팅을 한다
int sigaddset (sigset_t *set, int signum)
sigset_t에 signum signal을 셋팅한다
int sigdelset (sigset_t*set, int signum)
sigset_t에 signum을 제거한다
int sigismember (const sigset_t *set, int signum)
sigset_t에 signum이 셋팅되어있는지 체크 (1이면 있음)
int sigprocmask (int how, const sigset t *restrict set, sigset t *restrict oldset)
호출한 process의 signal을 변형하거나 examine한다
how :
SIG_BLOCK : set에 있는 signal을 block한다 (기존의 mask에 set에 등록된 signal을 추가한다)
SIG_UNBLOCK : 기존의 signal set에서 set에 있는 signal을 unlock한다
SIG_SETMASK : 이전의 signal set을 무시하고 set으로 signal을 셋팅한다
oldset : 기존의 signal set이 저장된다.
set에 NULL을 넣게 되면 현재 지정된 signal set을 oldset으로 부터 얻을수 있다 이때 how는 어떤것이라도 상관없음
signum에 대한 action을 셋팅해준다 old-action은 셋팅하기전의 이전의 action이 반환된다.
action이 null일 경우에는 old-action을 통해서 현재 셋팅된 action에 대한 값을 얻어올수 있다.
struct sigaction {
sighandler_t sa_handler; // SIG_DFL, SIG_IGN, 함수포인터 가 될수 있다
sigset_t sa_mask; // handler가 실행될 동안 block되야하는 signal (기본적으로 block되므로 unblock하고 싶으면 조작해줘야함)
int sa_flags;
}
sa_flags:
SA_NOCLDSTOP : SIG_CHLD에만 의미가 있고 셋팅되어있으면 terminated child에 대해서만 signal을 보냄 (stop된것에는 보내지않음)
SA_ONSTACK : signal stack을 사용한다, 만약 sigaltstack()나 sigstack()를 통해서 다른 시그널 스택 영역을 할당해 놓았다면, 시그널들이 이 새로운 스택 영역으로 전달되게 한다.
SA_RESTART : open, read, write같은 함수 실행중 signal이 발생할경우 어떤식으로 할지 정한다 (이게 셋팅되어있으면 library함수를 재시작한다)
sigset_t : signal을 표현하고 있는 구조체 또는 정수로 선언됨 (signal.h)
bits/sigset.h
# define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int)))
typedef struct
{
unsigned long int __val[_SIGSET_NWORDS];
} __sigset_t;
========= sigset_t를 조작하거나 셋팅하는 함수 ============
int sigemptyset (sigset_t *set)
sigset_t에 모든 signal셋팅을 clear한다
int sigfillset (sigset_t *set)
sigset_t에 모든 signal셋팅을 한다
int sigaddset (sigset_t *set, int signum)
sigset_t에 signum signal을 셋팅한다
int sigdelset (sigset_t*set, int signum)
sigset_t에 signum을 제거한다
int sigismember (const sigset_t *set, int signum)
sigset_t에 signum이 셋팅되어있는지 체크 (1이면 있음)
int sigprocmask (int how, const sigset t *restrict set, sigset t *restrict oldset)
호출한 process의 signal을 변형하거나 examine한다
how :
SIG_BLOCK : set에 있는 signal을 block한다 (기존의 mask에 set에 등록된 signal을 추가한다)
SIG_UNBLOCK : 기존의 signal set에서 set에 있는 signal을 unlock한다
SIG_SETMASK : 이전의 signal set을 무시하고 set으로 signal을 셋팅한다
oldset : 기존의 signal set이 저장된다.
set에 NULL을 넣게 되면 현재 지정된 signal set을 oldset으로 부터 얻을수 있다 이때 how는 어떤것이라도 상관없음