Namespaces
Variants

signal

From cppreference.net
헤더 파일에 정의됨 <signal.h>
void ( * signal ( int sig, void ( * handler ) ( int ) ) ) ( int ) ;

시그널 sig 의 오류 핸들러를 설정합니다. 시그널 핸들러는 기본 처리가 발생하도록, 시그널이 무시되도록, 또는 사용자 정의 함수가 호출되도록 설정할 수 있습니다.

시그널 핸들러가 함수로 설정되고 시그널이 발생할 때, signal ( sig, SIG_DFL ) 가 시그널 핸들러 시작 직전에 즉시 실행될지 여부는 구현에 따라 정의됩니다. 또한 구현은 시그널 핸들러가 실행되는 동안 일부 구현 정의된 시그널 집합의 발생을 방지할 수 있습니다.

목차

매개변수

sig - 시그널 핸들러를 설정할 시그널. 구현에서 정의된 값이거나 다음 값 중 하나일 수 있습니다:
시그널 타입을 정의합니다
(매크로 상수)
handler - 시그널 핸들러. 다음 중 하나여야 합니다:
  • SIG_DFL 매크로. 시그널 핸들러가 기본 시그널 핸들러로 설정됩니다.
  • SIG_IGN 매크로. 시그널이 무시됩니다.
  • 함수에 대한 포인터. 함수의 시그니처는 다음과 동일해야 합니다:
void fun ( int sig ) ;

반환값

성공 시 이전 시그널 핸들러 또는 SIG_ERR 실패 시 (일부 구현에서는 시그널 핸들러 설정이 비활성화될 수 있음).

시그널 핸들러

사용자 정의 함수를 시그널 핸들러로 설치할 때 다음과 같은 제한 사항이 적용됩니다.

사용자 정의 함수가 SIGFPE , SIGILL 또는 SIGSEGV 를 처리하는 동안 반환할 경우, 그 동작은 정의되지 않습니다.

시그널 핸들러가 abort 또는 raise 의 결과로 호출된 경우, 시그널 핸들러가 raise 를 호출하면 그 동작은 정의되지 않습니다.

시그널 핸들러가 abort 또는 raise 의 결과가 아닌 다른 이유로 호출된 경우(즉, 시그널 핸들러가 비동기적 인 경우), 다음 상황에서의 동작은 정의되지 않습니다:

  • 시그널 핸들러는 다음을 제외한 표준 라이브러리 내의 어떤 함수도 호출합니다
  • abort
  • _Exit
  • quick_exit
  • signal 첫 번째 인자가 현재 처리 중인 시그널 번호인 경우 (비동기 핸들러는 자기 자신을 재등록할 수 있으나 다른 시그널은 불가능)
  • 원자적 인자가 lock-free인 경우 <stdatomic.h> 의 원자적 함수들
  • atomic_is_lock_free (모든 종류의 원자적 인자와 함께)
  • 시그널 핸들러는 정적 또는 스레드-지역 (since C11) 저장 기간 을 가지며 lock-free atomic 이 아닌 객체를 참조합니다 (since C11) , 정적 volatile sig_atomic_t 에 할당하는 경우는 제외합니다.

시그널 핸들러 진입 시, 부동 소수점 환경의 상태와 모든 객체의 값은 다음을 제외하고는 지정되지 않습니다.

시그널 핸들러에서 반환될 때, 시그널 핸들러에 의해 수정된 객체 중 volatile sig_atomic_t 또는 lock-free atomic이 아닌 객체의 값은 (since C11) 정의되지 않습니다.

다중 스레드 프로그램에서 signal 을 사용할 경우 동작은 정의되지 않습니다. 스레드 안전성이 요구되지 않습니다.

참고 사항

POSIX는 signal 이 스레드 안전해야 하며, 모든 시그널 핸들러에서 호출될 수 있는 비동기 시그널 안전 라이브러리 함수 목록을 명시합니다 .

abort raise 외에도, POSIX는 kill , pthread_kill , 그리고 sigqueue 가 동기 신호를 생성한다고 명시합니다.

POSIX는 시그널 핸들러 실행 중 시그널 전달과 관련하여 명세가 불충분하고 구현체별 차이가 크다는 이유로 signal 대신 sigaction 사용을 권장합니다.

예제

#include <signal.h>
#include <stdio.h>
volatile sig_atomic_t gSignalStatus;
void signal_handler(int signal)
{
  gSignalStatus = signal;
}
int main(void)
{
  signal(SIGINT, signal_handler);
  printf("SignalValue: %d\n", gSignalStatus);
  printf("Sending signal: %d\n", SIGINT);
  raise(SIGINT);
  printf("SignalValue: %d\n", gSignalStatus);
}

출력:

SignalValue: 0
Sending signal: 2
SignalValue: 2

참고문헌

  • C17 표준 (ISO/IEC 9899:2018):
  • 7.14.1.1 signal 함수 (p: 193-194)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.14.1.1 The signal function (p: 266-267)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.14.1.1 signal 함수 (p: 247-248)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.7.1.1 signal 함수

참고 항목

특정 신호에 대한 시그널 핸들러를 실행함
(함수)