在Linux環境下,C++程序可以使用信號(signals)來處理各種異步事件。信號是一種軟件中斷,用于通知進程某個事件已經發生。例如,當用戶按下Ctrl+C時,操作系統會向進程發送SIGINT信號,通知進程終止。
C++標準庫提供了對信號的基本支持,但更詳細的信號處理通常使用C語言的信號處理函數,如signal()和sigaction()。以下是一些基本的信號處理概念和如何在C++中使用它們:
信號類型:有許多不同類型的信號,包括SIGINT(中斷信號)、SIGTERM(終止信號)、SIGSEGV(段錯誤信號)等。
信號處理函數:你可以定義一個函數來處理特定的信號。這個函數被稱為信號處理函數或信號處理器。
signal()函數:這是一個簡單的信號處理函數注冊函數。它的原型如下:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
其中signum是要處理的信號編號,handler是當該信號發生時要調用的函數指針。
sigaction()函數:這是一個更高級的信號處理函數注冊函數,它提供了更多的控制和靈活性。它的原型如下:
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
其中signum是要處理的信號編號,act是指向新信號處理動作的結構體指針,oldact是指向舊信號處理動作的結構體指針(如果不需要保存舊的處理動作,可以設置為NULL)。
信號掩碼:信號掩碼用于阻塞某些信號,即在特定代碼段執行期間不希望被處理的信號。
下面是一個簡單的C++程序示例,演示了如何使用signal()函數來處理SIGINT信號:
#include <csignal>
#include <iostream>
// 信號處理函數
void signalHandler(int signum) {
std::cout << "Interrupt signal (" << signum << ") received.\n";
// 清理并關閉
// ...
// 終止程序
exit(signum);
}
int main() {
// 注冊信號 SIGINT 和它的處理函數
signal(SIGINT, signalHandler);
// 無限循環
while (true) {
// 程序的主要邏輯
}
return 0;
}
在上面的例子中,當用戶按下Ctrl+C時,操作系統會發送SIGINT信號給程序,然后調用signalHandler函數來處理這個信號。
請注意,信號處理應該盡可能簡單和快速,避免在信號處理函數中執行復雜的操作,尤其是那些可能引起阻塞或者需要同步的操作。這是因為信號可能在任何時候被觸發,而且如果信號處理函數執行時間過長,可能會錯過其他信號,導致程序行為異常。