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