C 시그널 처리
C 표준 라이브러리 |
---|
일반 주제 |
기타 주제 |
표준 라이브러리에서 시그널 처리(signal processing)는 프로그램이 실행 중에 다양한 시그널들을 어떻게 처리하는지를 정의한다. 시그널은 프로그램 내에서 몇몇 예외적인 행위(0으로 나누기 같은)를 보고하거나, 프로그램 외부의 비동기적 이벤트(키보드 키를 누르기 같은)를 보고할 수 있다.
표준 시그널
[편집]C 표준은 단지 6개의 시그널만을 정의한다. 이것들은 모두 signal.h
헤더에 정의되어 있다 (csignal
- C++에서):[1]
SIGABRT
- "abort", 비정상적 종료.SIGFPE
- 부동소수점.SIGILL
- "illegal", 유효하지 않은 명령어.SIGINT
- "interrupt", 프로그램에 보내진 상호적인 요청.SIGSEGV
- "세그멘테이션 오류", 유효하지 않은 메모리 접근.SIGTERM
- "terminate", 프로그램에 보내진 종료 요청.
추가적인 시그널들도 구현에 따라서 signal.h
헤더에 정의되어 있을 수 있다. 예를 들면 유닉스 계열 운영 체제는 15개 이상의 추가적인 시그널들을 정의한다.[2]
처리
[편집]시그널은 raise()
또는 kill()
시스템 호출을 호출함으로써 생성될 수 있다. raise()
는 현재 프로세스에 시그널을 보내며, kill()
은 특정한 프로세스에 시그널을 보낸다.
시그널 처리기(핸들러)는 두 개의 시그널(SIGKILL과 SIGSTOP는 잡히거나 무시될 수 없다)을 제외하고는 모두 정의될 수 있다. 시그널 처리기는 상응하는 시그널이 발생되었을 때 대상 환경에 의해 호출되는 함수이다. 대상 환경은 프로그램의 실행을 시그널 처리기가 반환하거나 longjmp()
를 호출할 때까지 대기시킨다. 최대한의 호환성을 위해서 비동기적 신호 처리기는 오직 다음을 수행하여야 한다 :
signal()
함수에 대한 성공적인 호출을 만들어야 한다.sig_atomic_t
volatile 변수 타입의 객체에 값들을 할당해야 한다.- 호출자에게 제어를 반환해야 한다
만약 시그널이 프로그램 내부에서의 에러를 보고한다면, 시그널 처리기는 abort()
, exit()
, longjmp()
를 호출함으로써 종료될 수 있다.
함수들
[편집]함수 | 설명 |
---|---|
raise
|
시그널을 인위적으로 발생시킨다 |
signal
|
프로그램이 특정한 시그널을 받았을 때의 행위를 설정한다 |
사용 예시
[편집]#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
static void catch_function(int signo) {
puts("Interactive attention signal caught.");
}
int main(void) {
if (signal(SIGINT, catch_function) == SIG_ERR) {
fputs("An error occurred while setting a signal handler.\n", stderr);
return EXIT_FAILURE;
}
puts("Raising the interactive attention signal.");
if (raise(SIGINT) != 0) {
fputs("Error raising the signal.\n", stderr);
return EXIT_FAILURE;
}
puts("Exiting.");
return EXIT_SUCCESS;
// exiting after raising signal
}
같이 보기
[편집]각주
[편집]- ↑ 《ISO/IEC 9899:1999 specification》 (PDF). p. 258, § 7.14 Signal handling.
- ↑ “The Open Group Base Specifications Issue 6 - signal.h - signals”. 2012년 1월 10일에 확인함.