C++ signal関数

#include <iostream>
#include <csignal> // signal関数を含むヘッダ
// シグナルハンドラ関数
void signalHandler(int signal) {
    std::cout << "Interrupt signal (" << signal << ") received." << std::endl;
    // プログラムの終了
    exit(signal);
}
int main() {
    // SIGINTシグナル(Ctrl+C)のハンドラを設定
    signal(SIGINT, signalHandler);
    std::cout << "Waiting for Ctrl+C..." << std::endl;
    // 無限ループ
    while (true) {
        // 何かの処理
    }
    return 0;
}

このプログラムでは、Ctrl+C(SIGINT)シグナルをキャッチし、カスタムのシグナルハンドラ関数 signalHandler() が呼び出されます。その後、プログラムはシグナルハンドラ内で exit() 関数を使用して終了します。

このように、signal() 関数を使用してシグナルを処理することで、プログラムが外部からのシグナルに対して適切に反応できるようになります。

***************************************************

#include <iostream>
#include <windows.h>
// Ctrl+C シグナル(SIGINT)のハンドラ関数
BOOL WINAPI consoleCtrlHandler(DWORD ctrlType) {
    switch (ctrlType) {
        case CTRL_C_EVENT:
            std::cout << "Ctrl+C signal received." << std::endl;
            // ここで処理を行う
            return TRUE;
        case CTRL_BREAK_EVENT:
            std::cout << "Ctrl+Break signal received." << std::endl;
            // ここで処理を行う
            return TRUE;
        default:
            return FALSE;
    }
}
int main() {
    // Ctrl+C シグナル(SIGINT)と Ctrl+Break シグナルのハンドラを設定
    if (!SetConsoleCtrlHandler(consoleCtrlHandler, TRUE)) {
        std::cerr << "Error setting console control handler." << std::endl;
        return 1;
    }
    std::cout << "Waiting for Ctrl+C or Ctrl+Break..." << std::endl;
    // 無限ループ
    while (true) {
        // 何かの処理
    }
    return 0;
}

このプログラムでは、Windows上でCtrl+CとCtrl+Breakのシグナルを処理する方法を示しています。SetConsoleCtrlHandler() 関数を使用して、コンソールのCtrl+CとCtrl+Breakのシグナルを処理するためのハンドラ関数を登録します。その後、シグナルが発生すると、登録されたハンドラ関数が呼び出されます。