在 Linux 下,C++ 可以使用信號(signals)來處理各種系統事件和異常情況。信號是一種軟件中斷,用于通知進程發生了某個特定事件。例如,當用戶按下 Ctrl+C 時,操作系統會向進程發送 SIGINT 信號,通知進程終止。
在 C++ 中,可以使用 <csignal> 頭文件中定義的信號處理函數來處理信號。下面是一個簡單的示例,演示了如何在 C++ 中處理 SIGINT 信號:
#include <iostream>
#include <csignal>
// 信號處理函數
void signalHandler(int signal) {
std::cout << "接收到信號: " << signal << std::endl;
}
int main() {
// 注冊信號處理函數
std::signal(SIGINT, signalHandler);
std::cout << "按 Ctrl+C 終止程序..." << std::endl;
// 主循環,等待信號
while (true) {
// 空循環,等待信號
}
return 0;
}
在這個示例中,我們首先包含了 <csignal> 頭文件,并定義了一個信號處理函數 signalHandler。然后,在 main 函數中,我們使用 std::signal 函數注冊了信號處理函數,將 SIGINT 信號與 signalHandler 函數關聯起來。
當用戶按下 Ctrl+C 時,操作系統會向進程發送 SIGINT 信號,我們的程序會調用 signalHandler 函數來處理這個信號。在這個示例中,signalHandler 函數只是簡單地打印出接收到的信號編號。
需要注意的是,信號處理函數應該盡可能簡單,避免執行復雜的操作,因為信號可能在任何時刻被觸發,而且信號處理函數的執行可能會中斷正常的程序流程。此外,某些信號(如 SIGKILL 和 SIGSTOP)無法被捕獲和處理。
除了 <csignal> 頭文件外,還可以使用 POSIX 信號處理 API,如 sigaction 函數,來實現更高級的信號處理功能。sigaction 函數提供了更多的控制和配置選項,例如設置信號掩碼、設置信號處理動作等。