signal

인터럽트 신호 처리를 설정합니다.

Important

테스트 또는 디버깅 시나리오를 제외하고 이 방법을 사용하여 Microsoft Store 앱을 종료하지 마세요. Microsoft Store 정책에 따라 스토어 앱을 닫는 프로그래밍 방식 또는 UI 방법은 허용되지 않습니다. 자세한 내용은 UWP 앱 수명 주기를 참조 하세요.

구문

void __cdecl *signal(int sig, int (*func)(int, int));

매개 변수

sig
신호 값입니다.

func
두 번째 매개 변수는 실행할 함수에 대한 포인터입니다. 첫 번째 매개 변수는 신호 값이고 두 번째 매개 변수는 첫 번째 매개 변수가 될 때 사용할 수 있는 하위 코드입니다 SIGFPE.

반환 값

signal 는 지정된 신호와 연결된 func의 이전 값을 반환합니다. 예를 들어 func의 이전 값이 SIG_IGN인 경우 반환 값도 SIG_IGN입니다. SIG_ERR의 반환 값은 오류를 나타냅니다. 이 경우 errnoEINVAL로 설정됩니다.

반환 코드에 대한 자세한 내용은 , , 및 를 참조하세요errno._sys_nerr_sys_errlist_doserrno

설명

signal 함수를 사용하면 프로세스가 운영 체제에서 인터럽트 신호를 처리하는 여러 방법 중 하나를 선택할 수 있습니다. 인수는 sig 응답하는 signal 인터럽트입니다. 다음 매니페스트 상수 중 하나여야 합니다. 이 상수는 에 정의 SIGNAL.H되어 있습니다.

sig 설명
SIGABRT 비정상적인 종료
SIGFPE 부동 소수점 오류
SIGILL 잘못된 명령
SIGINT Ctrl+C 신호
SIGSEGV 잘못된 스토리지 액세스
SIGTERM 종료 요청

위의 값 중 하나가 아닌 경우 sig 매개 변수 유효성 검사에 정의된 대로 잘못된 매개 변수 처리기가 호출됩니다. 계속해서 실행하도록 허용한 경우 이 함수는 errnoEINVAL로 설정하고 SIG_ERR을 반환합니다.

기본적으로 signalsig의 값에 관계없이 종료 코드 3으로 호출 프로그램을 종료합니다.

참고 항목

SIGINT는 Win32 애플리케이션에 대해 지원되지 않습니다. Ctrl+C 인터럽트가 발생할 때 Win32 운영 체제는 특히 해당 인터럽트를 처리하기 위해 새 스레드를 생성합니다. 이렇게 하면 UNIX에서와 같은 단일 스레드 애플리케이션이 다중 스레드가 되며 예기치 않은 동작을 발생시킵니다.

인수는 func 작성하는 신호 처리기 또는 SIGNAL.H에 정의된 미리 정의된 신호 동작 상수SIG_DFLSIG_IGN하나에 대한 주소입니다. 함수인 경우 func 지정된 신호에 대한 신호 처리기로 설치됩니다. 신호 처리기의 프로토타입에는 sig 형식의 형식 인수 int가 하나 필요합니다. 운영 체제에서는 인터럽트가 발생할 때 sig를 통해 실제 인수를 제공합니다. 이 인수는 인터럽트를 생성한 신호입니다. 따라서 앞의 표에 나열된 6개의 매니페스트 상수를 신호 처리기에서 사용하여 인터럽트가 발생했는지 여부를 확인하고 적절한 조치를 취할 수 있습니다. 예를 들어 signal을 두 번 호출하여 동일한 처리기 또는 두 개의 서로 다른 신호를 할당한 다음 처리기에서 sig 인수를 테스트하여 수신 신호에 따라 서로 다른 조치를 취할 수 있습니다.

부동 소수점 예외(SIGFPE) func 를 테스트하는 경우 양식FPE_xxx의 여러 매니페스트 상수 FLOAT.H중 하나인 선택적 두 번째 인수를 사용하는 함수를 가리킵니다. 신호가 SIGFPE 발생하면 두 번째 인수의 값을 테스트하여 부동 소수점 예외의 종류를 확인한 다음 적절한 조치를 취할 수 있습니다. 이 인수 및 가능한 값은 Microsoft 확장입니다.

부동 소수점 예외의 func 경우 신호가 수신될 때 값이 다시 설정되지 않습니다. 부동 소수점 예외에서 복구하려면 try/except 절을 사용하여 부동 소수점 작업을 둘러쌉니다. 와 함께 사용하여 setjmp 복구할 수도 있습니다 longjmp. 이 두 경우 모두에서 호출 프로세스는 실행을 다시 시작하고 프로세스의 부동 소수점 상태를 정의되지 않은 상태로 둡니다.

신호 처리기가 반환되면 호출 프로세스는 신호 또는 작동 모드의 종류에 관계없이 인터럽트 신호를 받은 지점 바로 다음에 실행을 다시 시작합니다.

지정된 함수가 실행되기 전 func의 값이 SIG_DFL로 설정됩니다. 다음 인터럽트 신호는 SIG_DFL에 대한 장애가 있는 호출에서 별도로 지정하지 않는 한 signal에 대해 설명된 대로 처리됩니다. 이 기능을 사용하면 호출된 함수에서 신호를 다시 설정할 수 있습니다.

인터럽트 발생 시 신호 처리기 루틴이 비동기적으로 호출되는 경우가 많기 때문에 런타임 작업이 불완전하고 알 수 없는 상태일 때 신호 처리기 함수가 제어를 받을 수 있습니다. 다음 목록에서는 신호 처리기 루틴에서 사용할 수 있는 함수를 결정하는 제한 사항을 요약합니다.

  • 하위 수준 또는 STDIO.H I/O 루틴(예 printf : 또는 fread)을 실행하지 마세요.

  • 힙 루틴 또는 힙 루틴(예malloc: 또는_strdup_putenv)을 사용하는 루틴을 호출하지 마세요. 자세한 내용은 malloc를 참조하세요.

  • 시스템 호출(예 _getcwd : 또는 time)을 생성하는 함수는 사용하지 마세요.

  • 인터럽트에서 부동 소수점 예외(즉, sigSIGFPE)로 인해 발생하지 않는 한 사용하지 longjmp 마세요. 이 경우 먼저 _fpreset을 호출하여 부동 소수점 패키지를 다시 초기화합니다.

  • 오버레이 루틴을 사용하지 마세요.

함수를 사용하여 예외를 트래핑하려면 프로그램에 부동 소수점 코드가 SIGFPE 포함되어야 합니다. 프로그램에 부동 소수점 코드가 없고 런타임 라이브러리의 신호 처리 코드가 필요한 경우 휘발성 이중을 선언하고 0으로 초기화합니다.

volatile double d = 0.0f;

SIGILL Windows에서는 신호와 SIGTERM 신호가 생성되지 않습니다. ANSI 호환성을 위해 포함됩니다. 따라서 이러한 신호에 signal대한 신호 처리기를 설정할 수 있으며, 호출 raise하여 이러한 신호를 명시적으로 생성할 수도 있습니다.

신호 설정은 호출 _exec 또는 _spawn 함수에 의해 생성되는 생성된 프로세스에서 유지되지 않습니다. 신호 설정은 새 프로세스에서 기본값으로 다시 설정됩니다.

요구 사항

루틴에서 반환된 값 필수 헤더
signal <signal.h>

호환성에 대한 자세한 내용은 호환성을 참조하세요.

예시

다음 예제에서는 signal을 사용하여 일부 사용자 지정 동작을 SIGABRT 신호에 추가하는 방법을 보여 줍니다. 중단 동작에 대한 자세한 내용은 다음을 참조하세요 _set_abort_behavior.

// crt_signal.c
// compile with: /EHsc /W4
// Use signal to attach a signal handler to the abort routine
#include <stdlib.h>
#include <signal.h>

void SignalHandler(int signal)
{
    if (signal == SIGABRT) {
        // abort signal handler code
    } else {
        // ...
    }
}

int main()
{
    typedef void (*SignalHandlerPointer)(int);

    SignalHandlerPointer previousHandler;
    previousHandler = signal(SIGABRT, SignalHandler);

    abort();
}

출력은 사용된 런타임의 버전, 앱이 콘솔인지 Windows 앱인지 여부 및 Windows 레지스트리 설정에 따라 달라집니다. 콘솔 앱의 경우 다음 메시지와 같은 메시지가 stderr로 전송될 수 있습니다.

Debug Error!

Program: c:\Projects\crt_signal\Debug\crt_signal.exe

R6010

- abort() has been called

참고 항목

프로세스 및 환경 제어
abort
_exec, _wexec 함수
exit, _Exit, _exit
_fpreset
_spawn, _wspawn 함수