ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • std::signal
    프로그래밍 언어/C++ 2024. 7. 16. 09:55

    std::signal 함수는 C++ 표준 라이브러리에서 제공하는 함수로, 특정 신호(signal)가 발생했을 때 호출될 신호 처리기(signal handler)를 설정하는 데 사용됩니다. 이 함수는 C 라이브러리의 signal 함수와 동일한 기능

     

    #include <csignal>
    
    void ( *signal (int sig, void(*func)(int)) )(int);

     

    매개변수

    • sig: 설정할 신호의 종류를 나타내는 정수 값입니다. 표준 신호로는 SIGINT, SIGTERM, SIGKILL, SIGSEGV 등이 있습니다.
    • handler: 신호가 발생했을 때 호출될 함수의 포인터입니다. 이 함수는 정수형 매개변수를 하나 가지며, 해당 매개변수는 발생한 신호를 나타냅니다.

    반환값

    • 이전에 설정된 신호 처리기의 포인터를 반환합니다. 만약 이전에 설정된 신호 처리기가 없었다면, 기본 동작을 나타내는 SIG_DFL을 반환합니다.

     

    #include <csignal>
    #include <atomic>
    #include <iostream>
    
    volatile std::sig_atomic_t signalReceived = 0;
    
    void signalHandler(int signal) {
        signalReceived = 1;
    }
    
    int main() {
        // 신호 처리기 설정
        std::signal(SIGINT, signalHandler);
    
        std::cout << "프로그램 실행 중... (Ctrl+C를 눌러 종료)\n";
    
        while (!signalReceived) {
            // 메인 루프 - 여기에 실제 작업 코드가 들어갈 수 있습니다.
        }
    
        std::cout << "SIGINT 신호를 받았습니다. 프로그램을 종료합니다.\n";
        return 0;
    }

     

    중요한 신호 값

    • SIGINT: 인터럽트 신호. 일반적으로 Ctrl+C 입력 시 발생.
    • SIGTERM: 종료 신호. 프로그램을 정상적으로 종료할 때 사용.
    • SIGKILL: 강제 종료 신호. 프로그램을 강제 종료할 때 사용.
    • SIGSEGV: 세그멘테이션 오류 신호. 잘못된 메모리 접근 시 발생.
    • SIGABRT: 프로세스 중단 신호. abort 함수 호출 시 발생.

    특수한 신호 처리기 값

    • SIG_DFL: 기본 동작을 수행합니다. 이는 신호를 무시하거나 기본 동작(프로그램 종료 등)을 수행하는 것을 의미합니다.
    • SIG_IGN: 신호를 무시합니다. 신호가 발생해도 아무 작업도 수행하지 않습니다.

     

    부록 - sig_atomic_t

    sig_atomic_t는 C 및 C++ 언어에서 신호 처리기(signal handler) 내에서 사용하기 위해 정의된 데이터 타입입니다. 이 타입은 다음과 같은 중요한 특징들을 가지고 있습니다:

    1. 원자성(Atomicity): sig_atomic_t 타입의 변수를 사용하면, 해당 변수에 대한 읽기 및 쓰기 연산이 원자적으로 수행됩니다. 이는 신호 처리기 내에서 데이터의 일관성을 보장하기 위함입니다. 즉, 신호 처리기가 실행되는 동안 해당 변수에 대한 연산이 중단되지 않습니다.
    2. 데이터 타입: sig_atomic_t는 통상적으로 정수형 타입이며, 일반적으로 int와 같은 크기를 가집니다. 하지만 플랫폼에 따라 크기와 구현이 달라질 수 있습니다.
    3. 사용 용도: 주로 신호 처리기 내부에서 플래그 변수나 단일 정수 값을 저장하는 데 사용됩니다. 이를 통해 메인 프로그램과 신호 처리기가 안전하게 데이터를 공유할 수 있습니다.
Designed by Tistory.