Signal訊號處理

2021-06-08 04:45:46 字數 4597 閱讀 8659

在goahead的linux模組main.c 檔案中,main函式中出現了以下三個語句:

signal(sigpipe, sig_ign);  

signal(sigint, siginthandler);

signal(sigterm, siginthandler);

這三條語句與網路訊號有關。在這裡做咯記錄。

1. 訊號概念

訊號是程序在執行過程中,由自身產生或由程序外部發過來的訊息(事件)。訊號是硬體中斷的軟體模擬(軟中斷)。每個訊號用乙個整型常量巨集表示,以sig開頭,比如sigchld、sigint等,它們在系統標頭檔案中定義,也可以通過在shell下鍵入kill –l檢視訊號列表,或者鍵入man 7 signal檢視更詳細的說明。

訊號的生成來自核心,讓核心生成訊號的請求來自3個地方:

使用者:使用者能夠通過輸入ctrl+c、ctrl+,或者是終端驅動程式分配給訊號控制字元的其他任何鍵來請求核心產生訊號;

核心:當程序執行出錯時,核心會給程序傳送乙個訊號,例如非法段訪問(記憶體訪問違規)、浮點數溢位等;

程序:乙個程序可以通過系統呼叫kill給另乙個程序傳送訊號,乙個程序可以通過訊號和另外乙個程序進行通訊。

由程序的某個操作產生的訊號稱為同步訊號(synchronous signals),例如除0;由象使用者擊鍵這樣的程序外部事件產生的訊號叫做非同步訊號。(asynchronous signals)。

程序接收到訊號以後,可以有如下3種選擇進行處理:

接收預設處理:接收預設處理的程序通常會導致程序本身消亡。例如連線到終端的程序,使用者按下ctrl+c,將導致核心向程序傳送乙個sigint的訊號,程序如果不對該訊號做特殊的處理,系統將採用預設的方式處理該訊號,即終止程序的執行;

忽略訊號:程序可以通過**,顯示地忽略某個訊號的處理,例如:signal(sigint,sigdef);但是某些訊號是不能被忽略的,

捕捉訊號並處理:程序可以事先註冊訊號處理函式,當接收到訊號時,由訊號處理函式自動捕捉並且處理訊號。

2.signal函式

signal函式是c的庫函式之一。功能是設定某一訊號的對應動作,具體見

sigpipe:當伺服器close乙個連線的時候,若client接著發資料,根據tcp協議,會收到乙個rst相應。client再往這個伺服器傳送資料時,系統就會給程序乙個sigpipe訊號,告訴程序這個連線已經斷開了。不要在寫了。預設的sigpipe的處理過程是終止退出,在這個goahead明顯是不希望client退出,所以設定sigpipe的值為sig_ign

4.signal(sigint, siginthandler);

sigint是指終端ctrl+c產生的訊號,此語句使函式siginthandler能捕捉到終端的ctrl+c這一動作

5.signal(sigterm, siginthandler);

sigterm:關閉程序的乙個訊號。此語句使我們可以根據siginthandler來結束程序

sighup     終止程序     終端線路結束通話

sigint     終止程序     中斷程序

sigquit   建立core檔案終止程序,並且生成core檔案

sigill   建立core檔案       非法指令

sigtrap   建立core檔案       跟蹤自陷

sigbus   建立core檔案       匯流排錯誤

sigsegv   建立core檔案       段非法錯誤

sigfpe   建立core檔案       浮點異常

sigiot   建立core檔案       執行i/o自陷

sigkill   終止程序     殺死程序

sigpipe   終止程序     向乙個沒有讀程序的管道寫資料

sigalarm   終止程序     計時器到時

sigterm   終止程序     軟體終止訊號

sigstop   停止程序     非終端來的停止訊號

sigtstp   停止程序     終端來的停止訊號

sigcont   忽略訊號     繼續執行乙個停止的程序

sigurg   忽略訊號     i/o緊急訊號

sigio     忽略訊號     描述符上可以進行i/o

sigchld   忽略訊號     當子程序停止或退出時通知父程序

sigttou   停止程序     後台程序寫終端

sigttin   停止程序     後台程序讀終端

sigxgpu   終止程序     cpu時限超時

sigxfsz   終止程序     檔案長度過長

sigwinch   忽略訊號     視窗大小發生變化

sigprof   終止程序     統計分布圖用計時器到時

sigusr1   終止程序     使用者定義訊號1

sigusr2   終止程序     使用者定義訊號2

sigvtalrm 終止程序     虛擬計時器到時

1) sighup 本訊號在使用者終端連線(正常或非正常)結束時發出, 通常是在終端的控

制程序結束時, 通知同一session內的各個作業, 這時它們與控制終端

不再關聯.

2) sigint 程式終止(interrupt)訊號, 在使用者鍵入intr字元(通常是ctrl-c)時發出

3) sigquit 和sigint類似, 但由quit字元(通常是ctrl-)來控制. 程序在因收到

sigquit退出時會產生core檔案, 在這個意義上類似於乙個程式錯誤信

號. 4) sigill 執行了非法指令. 通常是因為可執行檔案本身出現錯誤, 或者試圖執行

資料段. 堆疊溢位時也有可能產生這個訊號.

5) sigtrap 由斷點指令或其它trap指令產生. 由debugger使用.

6) sigabrt 程式自己發現錯誤並呼叫abort時產生.

6) sigiot 在pdp-11上由iot指令產生, 在其它機器上和sigabrt一樣.

7) sigbus 非法位址, 包括記憶體位址對齊(alignment)出錯. eg: 訪問乙個四個字長

的整數, 但其位址不是4的倍數.

8) sigfpe 在發生致命的算術運算錯誤時發出. 不僅包括浮點運算錯誤, 還包括溢

出及除數為0等其它所有的算術的錯誤.

9) sigkill 用來立即結束程式的執行. 本訊號不能被阻塞, 處理和忽略.

10) sigusr1 留給使用者使用

11) sigsegv 試圖訪問未分配給自己的記憶體, 或試圖往沒有寫許可權的記憶體位址寫資料.

12) sigusr2 留給使用者使用

13) sigpipe broken pipe

14) sigalrm 時鐘定時訊號, 計算的是實際的時間或時鐘時間. alarm函式使用該

訊號.

15) sigterm 程式結束(terminate)訊號, 與sigkill不同的是該訊號可以被阻塞和

處理. 通常用來要求程式自己正常退出. shell命令kill預設產生這

個訊號.

17) sigchld 子程序結束時, 父程序會收到這個訊號.

18) sigcont 讓乙個停止(stopped)的程序繼續執行. 本訊號不能被阻塞. 可以用

乙個handler來讓程式在由stopped狀態變為繼續執行時完成特定的

工作. 例如, 重新顯示提示符

19) sigstop 停止(stopped)程序的執行. 注意它和terminate以及interrupt的區別:

該程序還未結束, 只是暫停執行. 本訊號不能被阻塞, 處理或忽略.

20) sigtstp 停止程序的執行, 但該訊號可以被處理和忽略. 使用者鍵入susp字元時

(通常是ctrl-z)發出這個訊號

21) sigttin 當後台作業要從使用者終端讀資料時, 該作業中的所有程序會收到sigttin

訊號. 預設時這些程序會停止執行.

22) sigttou 類似於sigttin, 但在寫終端(或修改終端模式)時收到.

23) sigurg 有"緊急"資料或out-of-band資料到達socket時產生.

24) sigxcpu 超過cpu時間資源限制. 這個限制可以由getrlimit/setrlimit來讀取/

改變 25) sigxfsz 超過檔案大小資源限制.

26) sigvtalrm 虛擬時鐘訊號. 類似於sigalrm, 但是計算的是該程序占用的cpu時間.

27) sigprof 類似於sigalrm/sigvtalrm, 但包括該程序用的cpu時間以及系統呼叫的

時間.

28) sigwinch 視窗大小改變時發出.

29) sigio 檔案描述符準備就緒, 可以開始進行輸入/輸出操作.

30) sigpwr power failure

有兩個訊號可以停止程序:sigterm和sigkill。 sigterm比較友好,程序能捕捉這個訊號,根據您的需要來關閉程式。在關閉程式之前,您可以結束開啟的記錄檔案和完成正在做的任務。在某些情況下,假如程序正在進行作業而且不能中斷,那麼程序可以忽略這個sigterm訊號。

對於sigkill訊號,程序是不能忽略的。這是乙個 「我不管您在做什麼,立刻停止」的訊號。假如您傳送sigkill訊號給程序,linux就將程序停止在那裡。

訊號處理 signal和sigaction的區別

下面所指的signal都是指以前的older signal函式,現在大多系統都用sigaction重新實現了signal函式 1 signal在呼叫handler之前先把訊號的handler指標恢復 sigaction呼叫之後不會恢復handler指標,直到再次呼叫sigaction修改handle...

signal訊號處理機制

可以用函式signal註冊乙個訊號捕捉函式。原型為 include typedef void sighandler t int sighandler t signal int signum,sighandler t handler signal的第1個引數signum表示要捕捉的訊號,第2個引數是個...

signal訊號處理基礎篇

signal函式的原型如下void signal int void fun int int 由此可見該函式的返回值是乙個指向 void fun int 型別的指標,即返回上一次和該訊號繫結的 訊號處理函式位址。程序對訊號的處理有三種方式 1 忽略此訊號,如signal sigint,sig ign ...