1. 개념과 개요
System Program/signal 2014. 2. 19. 13:43프로세스에 가해지는 소프트웨어적인 인터럽트라고 이해하면 쉽다.
1. 시그널의 범주
전통적 또는 표준 시그널이라는 두 가지의 큰 범주로 나누어진다. 리눅스에서 표준 시그널은 1 ~ 31까지의 범위이다.
그 이외의 범위는 실시간 시그널에 해당된다.
2. 기본 동작
시그널이 프로세스에 전달되면 다음 중 하나의 기본 동작을 수행한다.
- 시그널이 무시된다. 커널에 의해 버려지고 프로세스에는 아무런 영향이 없다.
- 프로세스를 종료한다. 비 정상적 프로세스 종료라고 한다.
- 코어 덤프 파일을 생성하고 프로세스를 종료한다.
- 프로세스를 멈춘다.
- 이전에 멈췄던 프로세스의 실행을 재개한다.
3. 속성 변경
시그널의 기본 동작을 변경할 수 있는데 이를 속성 변경이라고 하며 아래 중 하나로 변경할 수 있다.
- 기본 동작 수행 (이전에 변경된 속성을 원래되로 돌리는 경우를 말함)
- 시그널을 무시한다. (종료가 기본 동작인 시그널에 유용하다)
- 시그널 핸들러를 실행한다.
* 시그널 핸들러에서 기본동작 수행과 시그널 무시는 핸들러 함수 대신에 각각 SIG_DFL과 SIG_IGN으로 핸들러 함수를 대신할 수 있다.
4. 속성 변경 예시
/* * main.c -- C Test App. * * Copyright (C) 2012-2013, 2013 heesoon.kim <chipmaker.tistory.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <signal.h> void signal_handler(int sig) { if(sig == SIGINT) printf("SIGINT is tranfered \n"); if(sig == SIGQUIT) { printf("SIGQUIT is tranfered \n"); exit(1); } } int main(int argc, char *argv[]) { if(signal(SIGINT, signal_handler) == SIG_ERR) { printf("signal error\n"); exit(1); } if(signal(SIGQUIT, signal_handler) == SIG_ERR) //if(signal(SIGQUIT, SIG_DFL) == SIG_ERR) { printf("signal error\n"); exit(1); } //while(getchar() != 'q'); for(;;) { printf("main function is paused, PID = %d \n", getpid()); pause(); } return 0; }
[설명]
SIGINT과 SIGQUIT의 기본 동작을 별도의 시그널 핸들러 함수를 통하여 변경하였다.
SIGQUIT의 기본 동작은 비 정상적인 프로세스 종료를 유도하고 디버깅을 위한 코어덤프를 수행하는 것이다.
이 예제에서는 비 정상적인 종료라는 기본동작을 변경하여 정상적인 종료 동작을 하도록 강제로 변경하였다.
예제로써 적절한 것 같지는 않지만 동작성을 읽히는데 포커스를 둔다.
'System Program > signal' 카테고리의 다른 글
6. sigaction() 함수에 대한 고찰 (0) | 2013.07.08 |
---|---|
5. (1 ~ 4)장에 대한 총괄 예제 (0) | 2013.07.08 |
3. 시그널 전송 방법(시스템 콜) (0) | 2013.07.08 |
2. 시그널의 종류와 사용법 (0) | 2013.07.08 |