[ 시그널 종류 ]
#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 |