본문 바로가기
프로그래밍

👨‍💻 [C++] C++ 의 ev++ 에서 ev::sig 는 무엇이며, 어떻게 활용할 수 있나요?

by 밝음의기둥 2025. 1. 14.
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

C++ 의 ev++ 에서 ev::sig 는 무엇이며, 어떻게 활용할 수 있는지 간략히 알아보았습니다.


질문 >

C++ 의 ev++ 에서 ev::sig 는 무엇이며, 어떻게 활용할 수 있나요?

답변 >

ev::sig는 ev++ 라이브러리에서 POSIX 신호(signal)를 처리하기 위한 클래스입니다. 이 클래스는 SIGINT, SIGTERM, SIGHUP와 같은 시스템 신호를 감시하고 처리할 수 있도록 설계되었습니다. 이벤트 기반 시스템에서 특정 신호를 받아 graceful shutdown(우아한 종료) 또는 특정 작업 수행을 구현할 때 유용하게 사용됩니다.


ev::sig의 주요 특징

  1. POSIX 신호 감시:
    • SIGINT, SIGTERM 등 특정 신호를 감지하여 콜백 함수 실행.
  2. 비동기 처리:
    • 신호가 발생했을 때 이벤트 루프와 통합되어 비동기 방식으로 처리.
  3. 객체 지향 인터페이스:
    • C++ 스타일로 신호 이벤트를 설정하고 관리.

사용법

1. 기본 예제

아래는 SIGINT (Ctrl+C) 신호를 감지하고 이벤트 루프를 종료하는 간단한 예제입니다.

#include <ev++.h>
#include <iostream>

class SignalHandler {
public:
    SignalHandler() : signal(loop) {
        // SIGINT 신호를 처리하도록 설정
        signal.set<SignalHandler, &SignalHandler::onSignal>(this);
        signal.start(SIGINT);
    }

    void run() {
        std::cout << "Press Ctrl+C to stop the loop..." << std::endl;
        loop.run();  // 이벤트 루프 실행
    }

private:
    ev::default_loop loop;
    ev::sig signal;

    void onSignal(ev::sig &watcher, int revents) {
        std::cout << "Signal received, stopping event loop." << std::endl;
        loop.break_loop();  // 이벤트 루프 종료
    }
};

int main() {
    SignalHandler handler;
    handler.run();
    return 0;
}


2. 다중 신호 처리

여러 신호를 동시에 감시하려면 각각의 ev::sig 객체를 생성하여 설정하면 됩니다.

#include <ev++.h>
#include <iostream>

class MultiSignalHandler {
public:
    MultiSignalHandler() : sigInt(loop), sigTerm(loop) {
        // SIGINT 처리
        sigInt.set<MultiSignalHandler, &MultiSignalHandler::onSigInt>(this);
        sigInt.start(SIGINT);

        // SIGTERM 처리
        sigTerm.set<MultiSignalHandler, &MultiSignalHandler::onSigTerm>(this);
        sigTerm.start(SIGTERM);
    }

    void run() {
        std::cout << "Waiting for SIGINT (Ctrl+C) or SIGTERM..." << std::endl;
        loop.run();
    }

private:
    ev::default_loop loop;
    ev::sig sigInt, sigTerm;

    void onSigInt(ev::sig &watcher, int revents) {
        std::cout << "SIGINT received, stopping event loop." << std::endl;
        loop.break_loop();
    }

    void onSigTerm(ev::sig &watcher, int revents) {
        std::cout << "SIGTERM received, exiting gracefully." << std::endl;
        loop.break_loop();
    }
};

int main() {
    MultiSignalHandler handler;
    handler.run();
    return 0;
}


3. 람다 표현식 활용

C++11 이상의 람다를 사용하면 더 간단하게 신호 처리를 구현할 수 있습니다.

#include <ev++.h>
#include <iostream>

int main() {
    ev::default_loop loop;
    ev::sig sig(loop);

    // 람다로 SIGINT 처리
    sig.set([&loop](ev::sig &watcher, int revents) {
        std::cout << "SIGINT received, stopping event loop." << std::endl;
        loop.break_loop();
    });

    sig.start(SIGINT);

    std::cout << "Press Ctrl+C to stop the loop..." << std::endl;
    loop.run();

    return 0;
}


ev::sig 주요 메서드

1. set(callback)

  • 신호가 발생했을 때 호출될 콜백 함수 설정.
  • 멤버 함수, 람다, 또는 일반 함수로 설정 가능.

2. start(signal_number)

  • 특정 신호 감시를 시작.
  • 예: start(SIGINT)는 SIGINT 신호를 감시.

3. stop()

  • 감시 중인 신호를 중단.

활용 사례

  1. 우아한 종료 (Graceful Shutdown):
    • SIGINT 또는 SIGTERM을 감지하여 리소스를 정리하고 애플리케이션 종료.
  2. 재구성 (Reload):
    • SIGHUP 신호를 감지하여 설정 파일을 다시 로드.
  3. 특정 작업 트리거:
    • 사용자 정의 신호를 감지하여 로그 기록, 알림, 또는 특정 작업 수행.

장점

  • 비동기 처리: 신호 발생 시 비동기로 안전하게 처리 가능.
  • 유연성: 다양한 신호와 콜백 방식을 지원.
  • 간결성: C++ 스타일의 객체 지향 API로 간단한 코드 작성 가능.

ev::sig는 이벤트 루프 기반 애플리케이션에서 신호 처리 작업을 간편하고 우아하게 구현할 수 있도록 도와줍니다. 특히 서버와 같은 장기 실행 프로세스에서 종료, 재시작, 설정 변경 등의 작업을 관리할 때 매우 유용합니다.



🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌

www.youtube.com

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com


반응형