'시그날'에 해당되는 글 1건

  1. 2010.01.21 sigaction

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는 어떤것이라도 상관없음
And
prev | 1 | next