- 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.
廣告