在Linux系統中,C++信號處理機制是一種允許程序響應異步事件的方法。這些事件通常是由操作系統或其他進程產生的,例如用戶按下Ctrl+C、進程收到終止信號等。C++通過signal
庫提供了對這些信號的處理功能。
SIGINT
:由用戶按下Ctrl+C產生。SIGTERM
:請求進程終止。SIGKILL
:強制終止進程,無法被捕獲或忽略。SIGSEGV
:段錯誤,通常由于訪問非法內存地址引起。SIGABRT
:程序調用abort()
函數時產生。在C++中,可以使用signal
函數來設置信號處理函數。以下是一個簡單的示例:
#include <csignal>
#include <iostream>
// 信號處理函數
void signalHandler(int signum) {
std::cout << "Interrupt signal (" << signum << ") received.\n";
// 清理并關閉資源
// 終止程序
exit(signum);
}
int main() {
// 注冊信號 SIGINT 和信號處理函數
signal(SIGINT, signalHandler);
std::cout << "Program is running. Press Ctrl+C to terminate.\n";
while (true) {
// 主循環
}
return 0;
}
在這個示例中,當用戶按下Ctrl+C時,程序會捕獲SIGINT
信號,并調用signalHandler
函數來處理該信號。
信號掩碼用于控制哪些信號可以被處理??梢允褂?code>sigprocmask函數來設置信號掩碼。以下是一個示例:
#include <csignal>
#include <iostream>
#include <unistd.h>
// 信號處理函數
void signalHandler(int signum) {
std::cout << "Interrupt signal (" << signum << ") received.\n";
exit(signum);
}
int main() {
sigset_t mask;
int signum;
// 清空信號掩碼
sigemptyset(&mask);
// 添加 SIGINT 到信號掩碼
sigaddset(&mask, SIGINT);
// 阻塞 SIGINT 信號
sigprocmask(SIG_BLOCK, &mask, NULL);
// 注冊信號 SIGINT 和信號處理函數
signal(SIGINT, signalHandler);
std::cout << "Program is running. Press Ctrl+C to terminate.\n";
while (true) {
// 主循環
}
return 0;
}
在這個示例中,SIGINT
信號被阻塞,直到信號掩碼被修改以允許該信號通過。
通過理解和使用C++的信號處理機制,可以編寫出更加健壯和響應迅速的程序。