詳細分析C 訊號處理

2022-09-27 13:06:13 字數 1691 閱讀 5381

訊號是由作業系統傳給程序的中斷,會提早終止乙個程式。在 unix、linux、mac os x 或 windows 系統上,可以通過按 ctrl+c 產生中斷。

有些訊號不能被程式捕獲,但是下表所列訊號可以在程式中捕獲,並可以基於訊號採取適當的動作。這些訊號是定義在 c++ 標頭檔案 中。

訊號描述

sigabrt

程式的異常終止,如呼叫 abort。

sigfpe

錯誤的算術運算,比如除以零或導致溢位的操作。

siwbiqztluegill

檢測非法指令。

sigint

程式終止(interrupt)信程式設計客棧號。

sigse**

非法訪問記憶體。

sigterm

傳送到程式的終止請求。

signal() 函式

c++ 訊號處理庫提供了 signal 函式,用來捕獲突發事件。以下是 signal() 函式的語法:

void (*signal (int sig, void (*func)(int)))(int);

這個函式接收兩個引數:第乙個引數是乙個整數,代表了訊號的編號;第二個引數是乙個指向訊號處理函式的指標。

讓我們編寫乙個簡單的 c++ 程式,使用 signal() 函式捕獲 sigint 訊號。不管您想在程式中捕獲什麼訊號,您都必須使用 signal 函式來註冊訊號,並將其與訊號處理程式相關聯。看看下面的例項:

#include

#include

#include

using namespace std;

void signalhandler( int signum )

iwbiqztluent main ()

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、sigse**、sigterm、sighup。以下是我們使用 raise() 函式內部生成訊號的例項:

#include

#include

#include

using namespace std;

void signalhandler( int signum )

int main ()

sleep(1);

} return 0;

}當上面的**被編譯和執行時,它會產生下列結果,並會自動退出:

going to sleep....

going to sleep....

going to sleep....

interrupt signal (2) received.

C 陣列 詳細分析

c 陣列 詳細分析 摘自 1 陣列下標 1 在定義時必須明確。只能用正整數或const常量,靜態或全域性變數不可以 例如 const int length 5 int array length 特 在new時可以用變數做下標。例如 int array new int variable 2 在初始化時...

C 陣列 詳細分析

1 陣列下標 1 在定義時必須明確。只能用正整數或const常量,靜態或全域性變數不可以 例如 const int length 5 int array length 特 在new時可以用變數做下標。例如 int array new int variable 2 在初始化時 一維陣列,可略 例如 i...

const詳細分析

最近在分析 linux 驅動的過程過程中遇到一些關於 const 的使用,現在在這裡詳細剖析一下 一,const int p 首先分析一下幾個概念 1 p 是乙個指標變數,因而它也是乙個變數,所謂變數就有變數的位址和變數的值,而這裡 p變數的值就是乙個位址,該位址下存放的是乙個整數,p的值等於這個整...