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, SIGIOSIGOTHER은 ILE C/C++ 런타임 라이브러리에서만 지원됩니다. func 인수는 매크로 SIG_DFL 또는 SIG_IGN 중 하나여야 하며, <signal.h> 포함 파일이나 함수 주소에 정의됩니다.

sig의 값의 의미는 다음과 같습니다.
의미
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로 연장)
인터럽트 신호가 수신될 때 취해지는 조치는 func의 값에 따라 다릅니다.
의미
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  */