둘둘리둘둘리둘둘리둘둘리둘둘리둘

Signal 본문

Linux/Programming

Signal

dool2ly 2016. 7. 5. 14:38

@ 종류





@ Signal 특징


 - SIGKILL, SIGSTOP은 어플리케이션에서 catch 불가능하다. (시스템 관리차원)

 - 자식프로세스 생성시 signal정책도 상속된다

 - 어플리케이션이 Signal을 처리중에 들어온 다른 Signal은 버려진다




@ Signal 전송


kill(2)

       #include <sys/types.h>

       #include <signal.h>


       int kill(pid_t pid, int sig);


 - pid > 0   : 해당 pid에 전송

 - pid == 0 : 자신이 속한 모든 그룹 프로세스에 전송

 - pid < -1  : pid가 속한 모든 그룹 프로세스에 전송

 - pid == -1: init 프로세스를 제외한 모든 프로세스에 전송




@ Signal 핸들링


signal(2)

      #include <signal.h>


       typedef void (*sighandler_t)(int);


       sighandler_t signal(int signum, sighandler_t handler);


특정 Signal을 무시하고 싶을 경우 핸들링 함수 대신 SIG_IGN을 써도된다.

(SIG_IGN: 무시, SIG_DFL: 기본 동작)


ex)

#include <stdio.h>

#include <signal.h>

#include <unistd.h>


void SignHandler( int sign );


int main(){

    signal(SIGINT, (void *)SignHandler );

    //signal(SIGINT, SIG_IGN);

    while(1);

    return 0;

}


void SignHandler(int sign){

    printf("input:%d\n",sign);

    exit(0);

}




@ Signal 핸들링 2

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

set에 등록된 시그널의 볼럭 정책을 변경, 블록된 상태의 시그널은 handler가 끝나고 전달됨

-int how

SIG_BLOCK : set에 설정된 시그널을 기존 블록 set에 추가

SIG_UNBLOCK : set에 설정된 시그널을 기존 블록 set에서 제거

SIG_SETMASK : set의 시그널셋을 블록 set 정책으로 정함


int sigpending(sigset_t *set);

set의 시그널이 블록된 상태에서 들어온적 있는지 확인


int sigismember(sigset_t *set, int signum);

signum이 set에 포함되어있는지 확인


int sigsuspend(const sigset_t *mask);

호출한 프로세스의 시그널 마스크를 일시적으로 대체함


int sigfillset(sigset_t *set);

set의 모든 시그널을 on


int sigemptyset(sigset_t *set);

set의 모든 시그널을 off


int sigaddset(sigset_t *set, int signum);

signum을 set에 추가함


int sigdelset(sigset_t *set, int signum);

signum을 set에서 제거함




ref: http://www.joinc.co.kr/w/Site/system_programing/Book_LSP/ch06_Signal

'Linux > Programming' 카테고리의 다른 글

IPC(Inter Process Communication)  (0) 2016.07.09
Thread  (0) 2016.07.08
유저 정보 획득  (0) 2016.07.03
파일 속성 획득  (0) 2016.07.03
man page 사용법  (0) 2016.07.02
Comments