signal() — 인터럽트 신호 처리
형식
#include <signal.h>
void ( *signal (int sig, void(*func)(int)) )(int);
언어 레벨
ANSI
스레드세이프
예
설명
signal() 함수를 사용하여 프로그램이 운영 체제나 raise() 함수에서 인터럽트 신호를 처리할 수 있는 여러 방법 중 하나를 선택할 수 있습니다. SYSIFCOPT(*ASYNCSIGNAL) 옵션으로 컴파일하는 경우 이 함수는 비동기 신호를 사용합니다. 이 함수의 비동기 버전은 SA_NODEFER 및 SA_RESETHAND 옵션으로 sigaction() 같이 작동합니다. 비동기 신호 핸들러는 abort() 또는 exit()를 호출하지 않을 수 있습니다. 이 함수의 나머지 설명은 동기 신호를 설명합니다.
sig 인수는 매크로 SIGABRT, SIGALL, SIGILL, SIGINT, SIGFPE, SIGIO, SIGOTHER, SIGSEGV, SIGTERM, SIGUSR1 또는 SIGUSR2 중 하나여야 하며, signal.h 포함 파일에 정의됩니다. SIGALL, SIGIO 및 SIGOTHER은 ILE C/C++ 런타임 라이브러리에서만 지원됩니다. func 인수는 매크로 SIG_DFL 또는 SIG_IGN 중 하나여야 하며, <signal.h> 포함 파일이나 함수 주소에 정의됩니다.
- 값
- 의미
- SIGABRT
- 비정상 종료
- SIGALL
- 현재 핸들링 조치가 SIG_DFL인 신호에 대한 Catch-all입니다.
SYSIFCOPT(*ASYNCSIGNAL)이 지정되면 SIGALL은 catch-all 신호가 아닙니다. SIGALL을 위한 신호 핸들러는 사용자 격상된 SIGALL 신호에 대해서만 호출됩니다.
- SIGILL
- 유효하지 않은 함수 이미지의 발견
- SIGFPE
- 오버플로, 0으로 나눔 및 유효하지 않은 조작과 같이 마스크되지 않은 산술 예외
- SIGINT
- 대화식 어텐션
- SIGIO
- 레코드 파일 I⁄O 오류
- SIGOTHER
- ILE C 신호
- SIGSEGV
- 유효하지 않은 메모리에 액세스
- SIGTERM
- 프로그램에 전송된 요청 종료
- SIGUSR1
- 사용자 애플리케이션용입니다. (ANSI로 연장)
- SIGUSR2
- 사용자 애플리케이션용입니다. (ANSI로 연장)
- 값
- 의미
- SIG_DFL
- 신호에 대한 기본 처리가 발생합니다.
- SIG_IGN
- 신호는 무시됩니다.
리턴값
SIG_ERR의 리턴값은 signal()에 대한 호출에서의 오류를 표시합니다. 성공인 경우, signal()에 대한 호출은 func의 최근 값을 리턴합니다. errno의 값은 EINVAL으로 설정될 수 있습니다(신호가 유효하지 않음).
예
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#define ONE_K 1024
#define OUT_OF_STORAGE (SIGUSR1)
/* The SIGNAL macro does a signal() checking the return code */
#define SIGNAL(SIG, StrCln) { \
if (signal((SIG), (StrCln)) == SIG_ERR) { \
perror("Could not signal user signal"); \
abort(); \
} \
}
void StrCln(int);
void DoWork(char **, int);
int main(int argc, char *argv[]) {
int size;
char *buffer;
SIGNAL(OUT_OF_STORAGE, StrCln);
if (argc != 2) {
printf("Syntax: %s size \n", argv[0]);
return(-1);
}
size = atoi(argv[1]);
DoWork(&buffer, size);
return(0);
}
void StrCln(int SIG_TYPE) {
printf("Failed trying to malloc storage\n");
SIGNAL(SIG_TYPE, SIG_DFL);
exit(0);
}
void DoWork(char **buffer, int size) {
int rc;
*buffer = malloc(size*ONE_K); /* get the size in number of K */
if (*buffer == NULL) {
if (raise(OUT_OF_STORAGE)) {
perror("Could not raise user signal");
abort();
}
}
return;
}
/* This is a program fragment and not a complete function example */
관련 정보
- abort() — 프로그램 중단
- atexit() — 프로그램 종료 함수 레코드
- exit() — 프로그램 종료
- raise() — 송신 신호
- <signal.h>
- Information Center에 있는 APIs 주제에서 signal() API.