Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C/C++ raise() 함수 완벽 정리 – 시그널 전송 방법과 예제

raise() 함수는 프로그램에 시그널(signal)을 전송하는 데 사용됩니다. 이 함수가 호출되면 미리 정의된 signal() 함수가 실행되어, 해당 시그널을 무시할지 아니면 등록된 시그널 핸들러(signal handler)를 호출할지 판단하게 됩니다.

raise() 함수는 signal.h 헤더 파일에 선언되어 있으며, 실행에 성공하면 0을 반환하고 실패하면 0이 아닌 값(non-zero)을 반환합니다.

raise() 함수의 문법

int raise(int signal)

매개변수

  • signal − 호출할 시그널의 번호입니다.

주요 시그널 종류

  • SIGILL : 불법적인 명령(Illegal Instruction)이 감지된 경우
  • SIGINT : 사용자가 인터럽트(Ctrl+C)를 요청한 경우
  • SIGABRT : 프로그램이 비정상적으로 중단(abort)된 경우
  • SIGFPE : 부동 소수점 연산 오류(예: 0으로 나누기)가 발생한 경우
  • SIGSEGV : 잘못된 메모리 접근(Segmentation Fault)이 발생한 경우
  • SIGTERM : 프로그램 종료 요청이 전달된 경우

예제 코드

다음은 C 언어에서 raise() 함수를 사용하는 예제입니다.

#include <signal.h>
#include <stdio.h>

void handler(int sig) {
    printf("Signal received : %d\n", sig);
}

int main() {
    signal(SIGILL, handler);
    printf("Sending signal : %d\n", SIGILL);
    raise(SIGILL);
    return 0;
}

실행 결과

Sending signal : 4
Signal received : 4

코드 설명

위 프로그램의 동작 순서는 다음과 같습니다.

  1. handler 함수 정의 : main() 함수 이전에 시그널을 수신했을 때 실행될 handler 함수를 정의합니다. 이 함수는 수신한 시그널 번호를 화면에 출력합니다.
  2. 시그널 핸들러 등록 : signal(SIGILL, handler)를 호출하여 SIGILL 시그널이 발생했을 때 handler 함수가 실행되도록 등록합니다.
  3. 시그널 전송 및 수신 : printf()로 전송할 시그널 번호를 출력한 뒤, raise(SIGILL)을 통해 SIGILL 시그널을 직접 발생시키고, 등록된 핸들러가 이를 수신하여 처리합니다.
signal(SIGILL, handler);
printf("Sending signal : %d\n", SIGILL);
raise(SIGILL);

이처럼 raise() 함수를 활용하면 프로그램 내부에서 의도적으로 시그널을 발생시켜, 특정 상황에서 원하는 처리 로직(시그널 핸들러)을 실행할 수 있습니다.