
- C++ 基礎
- C++ 首頁
- C++ 概述
- C++ 環境設定
- C++ 基本語法
- C++ 註釋
- C++ Hello World
- C++ 省略名稱空間
- C++ 常量/字面量
- C++ 關鍵字
- C++ 識別符號
- C++ 資料型別
- C++ 數值資料型別
- C++ 字元資料型別
- C++ 布林資料型別
- C++ 變數型別
- C++ 變數作用域
- C++ 多個變數
- C++ 基本輸入/輸出
- C++ 修飾符型別
- C++ 儲存類
- C++ 運算子
- C++ 數字
- C++ 列舉
- C++ 引用
- C++ 日期和時間
- C++ 控制語句
- C++ 決策
- C++ if 語句
- C++ if else 語句
- C++ 巢狀 if 語句
- C++ switch 語句
- C++ 巢狀 switch 語句
- C++ 迴圈型別
- C++ while 迴圈
- C++ for 迴圈
- C++ do while 迴圈
- C++ foreach 迴圈
- C++ 巢狀迴圈
- C++ break 語句
- C++ continue 語句
- C++ goto 語句
- C++ 建構函式
- C++ 建構函式和解構函式
- C++ 複製建構函式
C++ 訊號處理
訊號是由作業系統傳遞給程序的中斷,它可能導致程式過早終止。您可以在 UNIX、LINUX、Mac OS X 或 Windows 系統上按 Ctrl+C 生成中斷。
有一些訊號程式無法捕獲,但以下列出了可以在程式中捕獲的訊號,並且可以根據訊號採取相應的操作。這些訊號在 C++ 標頭檔案 <csignal> 中定義。
序號 | 訊號和描述 |
---|---|
1 | SIGABRT 程式異常終止,例如呼叫 abort。 |
2 | SIGFPE 算術運算錯誤,例如除以零或導致溢位的運算。 |
3 | SIGILL 檢測到非法指令。 |
4 | SIGINT 收到互動式注意訊號。 |
5 | SIGSEGV 無效的儲存器訪問。 |
6 | SIGTERM 傳送到程式的終止請求。 |
signal() 函式
C++ 訊號處理庫提供函式 signal 來捕獲意外事件。以下是 signal() 函式的語法:
void (*signal (int sig, void (*func)(int)))(int);
簡單來說,此函式接收兩個引數:第一個引數是表示訊號編號的整數,第二個引數是指向訊號處理函式的指標。
讓我們編寫一個簡單的 C++ 程式,其中我們將使用 signal() 函式捕獲 SIGINT 訊號。您希望在程式中捕獲的任何訊號,都必須使用 signal 函式註冊該訊號並將其與訊號處理程式關聯。請檢視以下示例:
#include <iostream> #include <csignal> using namespace std; void signalHandler( int signum ) { cout << "Interrupt signal (" << signum << ") received.\n"; // cleanup and close up stuff here // terminate program exit(signum); } int main () { // register signal SIGINT and signal handler signal(SIGINT, signalHandler); while(1) { cout << "Going to sleep...." << endl; sleep(1); } return 0; }
編譯並執行以上程式碼後,將產生以下結果:
Going to sleep.... Going to sleep.... Going to sleep....
現在,按 Ctrl+c 中斷程式,您將看到程式會捕獲訊號並透過列印以下內容退出:
Going to sleep.... Going to sleep.... Going to sleep.... Interrupt signal (2) received.
raise() 函式
您可以透過函式 raise() 生成訊號,該函式以整數訊號編號作為引數,並具有以下語法。
int raise (signal sig);
這裡,sig 是要傳送的訊號編號,可以是以下任何訊號:SIGINT、SIGABRT、SIGFPE、SIGILL、SIGSEGV、SIGTERM、SIGHUP。以下是在其中我們使用 raise() 函式內部生成訊號的示例:
#include <iostream> #include <csignal> using namespace std; void signalHandler( int signum ) { cout << "Interrupt signal (" << signum << ") received.\n"; // cleanup and close up stuff here // terminate program exit(signum); } int main () { int i = 0; // register signal SIGINT and signal handler signal(SIGINT, signalHandler); while(++i) { cout << "Going to sleep...." << endl; if( i == 3 ) { raise( SIGINT); } sleep(1); } return 0; }
編譯並執行以上程式碼後,將產生以下結果並自動退出:
Going to sleep.... Going to sleep.... Going to sleep.... Interrupt signal (2) received.
廣告