signal
|
헤더 파일에 정의됨
<signal.h>
|
||
|
void
(
*
signal
(
int
sig,
void
(
*
handler
)
(
int
)
)
)
(
int
)
;
|
||
시그널
sig
의 오류 핸들러를 설정합니다. 시그널 핸들러는 기본 처리가 발생하도록, 시그널이 무시되도록, 또는 사용자 정의 함수가 호출되도록 설정할 수 있습니다.
시그널 핸들러가 함수로 설정되고 시그널이 발생할 때, signal ( sig, SIG_DFL ) 가 시그널 핸들러 시작 직전에 즉시 실행될지 여부는 구현에 따라 정의됩니다. 또한 구현은 시그널 핸들러가 실행되는 동안 일부 구현 정의된 시그널 집합의 발생을 방지할 수 있습니다.
목차 |
매개변수
| sig | - |
시그널 핸들러를 설정할 시그널. 구현에서 정의된 값이거나 다음 값 중 하나일 수 있습니다:
|
||||||
| handler | - |
시그널 핸들러. 다음 중 하나여야 합니다:
|
반환값
성공 시 이전 시그널 핸들러 또는 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 타입의 객체
- 락-프리 원자 타입의 객체 (since C11)
- atomic_signal_fence 를 통해 가시화된 사이드 이펙트 (since C11)
시그널 핸들러에서 반환될 때, 시그널 핸들러에 의해 수정된 객체 중 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 함수
참고 항목
|
특정 신호에 대한 시그널 핸들러를 실행함
(함수) |
|
|
C++ documentation
for
signal
|
|