signal
| 헤더에 정의됨 <signal.h>
|
||
void (*signal( int sig, void (*handler) (int))) (int);
|
||
시그널 sig의 처리를 변경합니다. handler의 값에 따라 시그널은 무시되거나, 기본값으로 설정되거나, 사용자 정의 함수로 처리될 수 있으며 다음과 같이 호출됩니다: (*handler)(sig).
시그널 핸들러가 함수로 설정되고 시그널이 발생하면, signal(sig, SIG_DFL)이(가) 시그널 핸들러 시작 직전에 실행될지 여부는 구현 정의입니다. 또한 구현은 시그널 핸들러가 실행되는 동안 일부 구현 정의 시그널 집합이 발생하는 것을 방지할 수 있습니다.
매개변수
| sig | - | 시그널 핸들러를 설정할 시그널입니다. 구현 정의 값이거나 다음 값 중 하나일 수 있습니다:
| ||||||
| handler | - | 시그널 핸들러입니다. 다음 중 하나여야 합니다:
|
반환값
성공 시 이전 시그널 핸들러, 실패 시 SIG_ERR (일부 구현에서는 시그널 핸들러 설정이 비활성화될 수 있습니다).
시그널 핸들러
시그널 핸들러로 설치된 사용자 정의 함수에 다음과 같은 제한이 적용됩니다.
사용자 정의 함수가 SIGFPE, SIGILL 또는 SIGSEGV을(를) 처리할 때 반환하면 동작이 정의되지 않습니다.
시그널 핸들러가 abort 또는 raise의 결과로 호출된 경우, 시그널 핸들러가 raise를 호출하면 동작이 정의되지 않습니다.
시그널 핸들러가 abort 또는 raise의 결과로 호출되지 않은 경우 (즉, 시그널 핸들러가 비동기적인 경우), 다음과 같은 경우 동작이 정의되지 않습니다:
- 시그널 핸들러가 표준 라이브러리의 함수를 호출하는 경우 (단, 다음은 제외:
- abort
- _Exit
- quick_exit
signal(첫 번째 인자는 현재 처리 중인 시그널 번호로, 비동기 핸들러는 자신을 재등록할 수 있지만 다른 시그널은 재등록할 수 없음).- 다음의 원자 함수
<stdatomic.h>(원자 인자가 Lock-free인 경우) - atomic_is_lock_free (모든 종류의 원자 인자와 함께)
- 시그널 핸들러가 static 또는 스레드-지역(C11부터) 저장 기간 을 가진 객체 중 Lock-free atomic(C11부터)이 아닌 객체를 참조하는 경우 (단, static
volatile sig_atomic_t에 할당하는 경우는 제외).
시그널 핸들러 진입 시, 부동소수점 환경의 상태와 모든 객체의 값은 명세되지 않습니다. 단, 다음은 예외입니다:
- 유형의 객체
volatile sig_atomic_t - Lock-free 원자 유형의 객체 (C11부터)
- 를 통해 가시화된 부작용 atomic_signal_fence (C11부터)
시그널 핸들러에서 반환할 때, 시그널 핸들러가 수정한 객체 중 volatile sig_atomic_t 또는 Lock-free 원자(C11부터)가 아닌 객체의 값은 정의되지 않습니다.
멀티스레드 프로그램에서 signal을(를) 사용하면 동작이 정의되지 않습니다. 스레드 안전할 필요는 없습니다.
참고
POSIX는 signal이(가) 스레드 안전해야 하며, 어떤 시그널 핸들러에서도 호출할 수 있는 비동기 시그널 안전 라이브러리 함수 목록을 명시합니다.
abort 및 raise 외에도, POSIX는 kill, pthread_kill, sigqueue이(가) 동기 시그널을 생성한다고 명시합니다.
POSIX는 시그널 핸들러가 실행되는 동안 시그널 전달에 관한 명세가 부족하고 구현 간 변동이 크기 때문에 sigaction 대신 signal을(를) 권장합니다.
예제
#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
참조
- C23 표준 (ISO/IEC 9899:2024):
- 7.14.1.1 The signal function (p: 285-286)
- C17 표준 (ISO/IEC 9899:2018):
- 7.14.1.1 The signal function (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 The signal function (p: 247-248)
- C89/C90 표준 (ISO/IEC 9899:1990):
- 4.7.1.1 The signal function
같이 보기
| 특정 시그널에 대한 시그널 핸들러를 실행합니다 (함수) | |
C++ 문서 에 대한 signal
| |