"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
C++ 의 ev++ 에서 ev::sig 는 무엇이며, 어떻게 활용할 수 있는지 간략히 알아보았습니다.
질문 >
C++ 의 ev++ 에서 ev::sig 는 무엇이며, 어떻게 활용할 수 있나요?
답변 >
ev::sig는 ev++ 라이브러리에서 POSIX 신호(signal)를 처리하기 위한 클래스입니다. 이 클래스는 SIGINT, SIGTERM, SIGHUP와 같은 시스템 신호를 감시하고 처리할 수 있도록 설계되었습니다. 이벤트 기반 시스템에서 특정 신호를 받아 graceful shutdown(우아한 종료) 또는 특정 작업 수행을 구현할 때 유용하게 사용됩니다.
ev::sig의 주요 특징
- POSIX 신호 감시:
- SIGINT, SIGTERM 등 특정 신호를 감지하여 콜백 함수 실행.
- 비동기 처리:
- 신호가 발생했을 때 이벤트 루프와 통합되어 비동기 방식으로 처리.
- 객체 지향 인터페이스:
- 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()
- 감시 중인 신호를 중단.
활용 사례
- 우아한 종료 (Graceful Shutdown):
- SIGINT 또는 SIGTERM을 감지하여 리소스를 정리하고 애플리케이션 종료.
- 재구성 (Reload):
- SIGHUP 신호를 감지하여 설정 파일을 다시 로드.
- 특정 작업 트리거:
- 사용자 정의 신호를 감지하여 로그 기록, 알림, 또는 특정 작업 수행.
장점
- 비동기 처리: 신호 발생 시 비동기로 안전하게 처리 가능.
- 유연성: 다양한 신호와 콜백 방식을 지원.
- 간결성: C++ 스타일의 객체 지향 API로 간단한 코드 작성 가능.
ev::sig는 이벤트 루프 기반 애플리케이션에서 신호 처리 작업을 간편하고 우아하게 구현할 수 있도록 도와줍니다. 특히 서버와 같은 장기 실행 프로세스에서 종료, 재시작, 설정 변경 등의 작업을 관리할 때 매우 유용합니다.
🎬 유튜브 채널 🎬
위로그@WiLog
📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌
www.youtube.com
🎬 치지직 채널 🎬
위로그 채널 - CHZZK
지금, 스트리밍이 시작됩니다. 치지직-
chzzk.naver.com
'프로그래밍' 카테고리의 다른 글
👨💻 [Go] Go 에서 시그널 이벤트를 처리하는 방법은 어떻게 되나요? (0) | 2025.01.15 |
---|---|
👨💻 [Go] Go 에서 모듈과 패키지의 이름을 짓는 규칙은 어떻게 되나요? (0) | 2025.01.15 |
👨💻 [C++] C++ 에서 evbase 는 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.14 |
👨💻 [C++] C++ 의 ev::default_loop 에서 EVBACKEND_EPOLL, EVFLAG_NOENV 옵션은 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.14 |
👨💻 [C++] C++ 에서 ev::default_loop 란 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.14 |