[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++로 리눅스 시그널을 처리하는 방법에 대해 알아보았습니다.

참고 자료