[c++] C++로 리눅스 시그널 처리하기
리눅스에서 시그널(signal)은 프로세스에게 발생한 이벤트를 알리는 메커니즘입니다. 시그널을 처리하는 것은 안정적인 프로세스 제어에 필수적입니다. C++로 리눅스 시그널을 처리하는 방법에 대해 알아보겠습니다.
시그널 처리 기본
리눅스 시그널은 대표적으로 SIGINT(Ctrl+C에 의해 발생)나 SIGSEGV(세그멘테이션 폴트)와 같은 종류가 있습니다. 시그널을 처리하기 위해서는 signal
함수를 사용하여 시그널 핸들러를 등록해야 합니다.
다음은 SIGINT를 처리하는 간단한 예제입니다.
#include <iostream>
#include <csignal>
#include <unistd.h>
void signalHandler(int signum) {
std::cout << "Interrupt signal (" << signum << ") received.\n";
exit(signum);
}
int main() {
signal(SIGINT, signalHandler);
while(1) {
std::cout << "Waiting for a signal...\n";
sleep(1);
}
return 0;
}
위의 코드는 SIGINT를 처리하는 신호 핸들러를 등록하고, 해당 시그널을 대기하는 간단한 예제입니다. Ctrl+C를 누르면 프로세스가 종료됩니다.
C++ 시그널 처리
C++에서 리눅스 시그널을 처리할 때에는 C 스타일의 signal
대신, <csignal>
헤더에 있는 std::signal
을 이용할 수 있습니다. 또한, std::function
으로 람다 함수를 사용하여 시그널 핸들러를 정의할 수 있습니다.
다음은 SIGINT를 처리하는 C++ 스타일의 예제 코드입니다.
#include <iostream>
#include <csignal>
#include <functional>
#include <unistd.h>
int main() {
std::signal(SIGINT, [](int signum) {
std::cout << "Interrupt signal (" << signum << ") received.\n";
exit(signum);
});
while(1) {
std::cout << "Waiting for a signal...\n";
sleep(1);
}
return 0;
}
결론
시그널 처리는 신중하게 다뤄져야 하며, 해당 처리와 관련된 주의사항을 숙지하는 것이 중요합니다. C++로 리눅스 시그널을 처리하는 방법을 이해하고 해당 기법을 적절히 활용하는 것은 안정적인 프로그램을 개발하는 데 도움이 될 것입니다.
이상으로, C++로 리눅스 시그널을 처리하는 방법에 대해 알아보았습니다.