Signal handler

Trong C++, bạn có thể dùng signal handler để bắt các tín hiệu hệ thống (như SIGINT khi nhấn Ctrl+C)

raise() gửi signal cho chính processhiện tại.

kill() gửi signal cho bất kỳ process (truyền vào PID).

#include <iostream>
#include <csignal>
#include <cstdlib>
#include <unistd.h>
#include <thread>
#include <chrono>
#include <string>

string GetSignalName(int signum) {
    switch(signum) {
        case SIGSEGV: return "Segmentation fault (SIGSEGV)";
        case SIGINT : return "Interrupt signal (SIGINT)";
        case SIGTERM: return "Termination signal (SIGTERM)";
        case SIGABRT: return "Abort signal (SIGABRT)";
        default:      return "<unknown>";
    }
}

void signalHandler(int signum) {
    cout << "[SIGNAL:" << signum << "] " << GetSignalName(signum) << endl;

    switch (signum) {
        case SIGINT:
            cout << "do something" << endl;
            //exit(signum);
        case SIGTERM:
            cout << "do something" << endl;
            //exit(signum);
        case SIGSEGV:
            cout << "do something and exit" << endl;
            exit(signum);
        case SIGABRT:
            cout << "Chương trình bị abort!" << endl;
            exit(signum);
        default:
            cout << "Nhận tín hiệu không xác định" << endl;
            exit(signum);
    }
}

int main() {
    // Đăng ký nhiều signal handler
    signal(SIGINT, signalHandler);
    signal(SIGTERM, signalHandler);
    signal(SIGSEGV, signalHandler);
    signal(SIGABRT, signalHandler);

    cout << "Gửi SIGINT bằng raise()..." << endl;
    raise(SIGINT);

    cout << "Gửi SIGTERM bằng kill()..." << endl;
    kill(getpid(), SIGTERM);

    cout << "Giả lập segmentation fault..." << endl;
    int* p = nullptr;
    *p = 42;  // gây lỗi truy cập bộ nhớ

    cout << "kết thúc"
	
    return 0;
}
Gửi SIGINT bằng raise()...
[SIGNAL:2] Interrupt signal (SIGINT)
do something
Gửi SIGTERM bằng kill()...
[SIGNAL:15] Termination signal (SIGTERM)
do something
Giả lập segmentation fault...
[SIGNAL:11] Segmentation fault (SIGSEGV)
do something and exit

Leave a Comment