본문 바로가기

나의 플랫폼/C언어

시그널 종류

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

[ 시그널 종류 ]


#define SIGHUP   1
#define SIGINT   2
#define SIGQUIT   3
#define SIGILL   4
#define SIGTRAP   5
#define SIGABRT   6
#define SIGIOT   6
#define SIGBUS   7
#define SIGFPE   8
#define SIGKILL   9
#define SIGUSR1  10
#define SIGSEGV  11
#define SIGUSR2  12
#define SIGPIPE  13
#define SIGALRM  14
#define SIGTERM  15
#define SIGSTKFLT 16
#define SIGCHLD  17
#define SIGCONT  18
#define SIGSTOP  19
#define SIGTSTP  20
#define SIGTTIN  21
#define SIGTTOU  22
#define SIGURG  23
#define SIGXCPU  24
#define SIGXFSZ  25
#define SIGVTALRM 26
#define SIGPROF  27
#define SIGWINCH 28
#define SIGIO  29
#define SIGPOLL  SIGIO
/*
#define SIGLOST  29
*/
#define SIGPWR  30
#define SIGSYS  31
#define SIGUNUSED 31

/* These should not be considered constants from userland.  */
#define SIGRTMIN 32
#define SIGRTMAX _NSIG

 

* 주요 시그널 종류

 

SIGABRT : abort함수를 호출하면 보내지며, 이 시그널을 받으면 코어 덤프하고 종료한다.

 

SIGALRM: alarm 함수를 호출하면 보내지며, 이 시그널을 받으면 종료한다.

 

SIGBUS: 하드웨어 결함이 탐지되면 보내지며, 이 시그널을 받으면 종료한다.

 

SIGCHLD : 자식 프로세스가 종료되면 부모 프로세스에 보내지며 ,wait에서 이 시그널에 의해 깨어난다.

 

SIGCONT:중단되어 있는 프로세스가 이 시그널을 받으면 실행을 하고 실행중인 프로세스가 받으면 무시한다.

 

SIGFPE:0으로 나누기,부동소수점 오류등이 발생했을때 보내지며, 이 시그널을 받으면 코어 덤프하고 종료

 

SIGHUP:터미널 연결이 끊어 졌을때 이 터미널과 연결된 세션 리더 또는 세션에 속한 모든 프로세스들에게 보내지며, 이시그널을 받으면 종료한다.

 

SIGILL:불법 명령어를 실행할때 보내지며, 이 시그널을 받으면 코어 덤프하고 종료한다.

 

SIGINT:터미널에서 인터럽트 키(일반적으로 <CTRL+C>)를 눌렀을때 보내지며, 이 시그널을 받을시 종료

 

SIGKILL:프로세스를 종료 시키기 위해 보내지며,이 시그널을 받으면 반드시 종료한다.

 

SIGPIPE:터미널에서 종료키(일반적으로<CTRL+\>)를 눌렀을때 보내지며, 이 시그널을 받으면 코어 덤프하고 종료

 

SIGSEGV:잘못된 메모리 주소를 접근하고자 할때 보내지며, 이 시그널을 받으면 코어 덤프하고 종료한다.

 

SIGSTOP:프로세스를 멈추기 위해 보내지며, 이 시그널을 받으면 반드시 멈춘다.

 

SIGSYS:잘못된 시스템 호출을 했을 때 보내지며, 이 시그널을 받으면 코어 덤프하고 종료한다.

 

SIGTERM:프로세스를 종료시키기 전에 하던 일을 정리하고 종료할 것을 알릴때 보내진다.

 

SIGTSTP:터미널에서 일시 중지 키(일반적으로(CTRL+Z))를 눌렀을때 보내지며, 이 시그널을 받을시 멈춤

 

SIGTTIN:백그라운드 작업중인 프로세스가 표준 입력을 하려 할때 현재 실행중인 프로세스에 보내지며 이시그널을 받으면 멈춘다.

 

SIGTTOU:백그라운드 작업중인 프로세스가 표준 출력을 하려 할때 현재 실행중인 프로세스에 보내지며, 이 시그널을 받으면 멈춘다.

 

SIGQUIT : 대화형 종료 : 코어 덤프 ( 보통 Ctrl + I)

 

SIGURS1&SIGURS2:사용자가 정의해서 사용할 수 있는 시그널로, 이 시그널을 받으면 종료한다.

 

 

* 시그널을 사용하는데 자주 쓰이는 함수들 : 시그널 마스크와 시그널 세트 다루기

 

int sigemptyset(sigset_t *set) //빈 시그널 집합을 생성

 

int sigfillset(sigset_t *set)//모든 시그널을 포함한 집합을 생성

 

int sigaddset(sigset_t,*set,int signum)//시그널 집합에 추가

 

int sigdelset(sigset_t,*set,int signum)//시그널 집합에서 삭제

 

int sigismember(const sigset_t *set, int signum)//시그널 집합에 signum이 속하는지 확인

 

set: 시그널 집합

 

signum: 시그널 번호

 

 

시그널 처리....

 

void (*signal(int signum,void(*sighandler)(int)))(int)//시그널 처리를 설정한다.

signum:시그널 번호

sighandler:설정할 시그널 핸들러

 

****시그널 핸들러의 종류 3가지*****

함수 이름 : 시그널을 받으면 "함수 이름" 함수가 실행됨.

SIG_IGN  : 시그널을 받으면 무시한다.

SIG_DFL : 시그널을 받으면 시스템에서 기본적으로 설정한 동작을 한다.

**********************************

조금 업글된 기능의 시그널 처리 함수로..

 

int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact)//시그널 처리를 설정

signum:시그널 번호

act : 설정할 행동

oldact:이전 행동

********act의 구조체 분석************

struct sigaction{

void(*sa_handler)(int)//설정할 시그널 핸들러

void (*sa_sigaction)(int,siginfo_t *,void *)//sa_handler 대신 사용될 시그널 핸들러

sigset_t sa_mask;//시그널을 처리하는 동안 블록화할 시그널 집합

int sa_flags;// 시그널 처리 관련 옵션들

void(*sa_restorer)(void);//사용되지 않음

}

 

 

시그널 보내기......

int kill(pid_t pid, int sig)//프로세스에 시그널을 보낸다.

int pause(void)//시그널이 도착할 때까지 실행을 중단시킨다.

int raise(int slg)//자기 자신에게 시그널을 보낸다.

unsigned int alarm(unsigned int seconds)//자신에게 SIGALRM시그널을 보낸다

pid:시그널을 받을 프로세스의 프로세스 ID

sig:보내고자 하는 시그널 번호

seconds: 시그널을 보낼 시간, 초

 

****pid값****

양의정수: 프로세스 ID가 pid인 프로세스에 시그널을 보낸다.

0: kill을 호출한 프로세스가 속한 프로세스 그룹의 모든 프로세스에 시그널을 보낸다

-1:1번 프로세스를 제외한 모든 프로세스에 큰 번호에서 작은 번호의 프로세스 순으로 시그널을 보낸다

-1미만:pid절대값프로세스 그룹의 모든 프로세스에 시그널을 보낸다.

 

 

시그널 블록.....

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset)//블록화될 시그널을 설정한다.

int sigpending(sigset_t *set)//블록화된 시그널을 얻어온다.

int sigsuspend(const sigset_t *mask)//시그널 블록을 설정함과 동시에 시그널이 도착할때까지 중단

how:취할 동작

mask:블록화될 시그널 집합

set: 설정할 시그널 집합

oldset: 이전에 블록화된 시그널 집합

 

****how 값******

SIG_BLOCK : 기존에 블록화된 시그널 집합에 set의 시그널이 추가된다.

SIG_UNBLOCK: 기존에 블록화된 시그널 집합에서 set의 시그널이 제외된다.

SIG_SETMASK:set의 시그널이 블록화된 시그널 집합으로 교체된다.

 

'나의 플랫폼 > C언어' 카테고리의 다른 글

[ESP8266] Exception (29) 발생 시  (1) 2018.07.06
Socket Interface Name으로 IP 주소 가져오기.  (0) 2013.03.06
Cache Friendly Code 기법  (0) 2013.03.04