|
hxl4strddkl6405875410.gif (60.41 KB, 下載次數(shù): 0)
下載附件
保存到相冊
hxl4strddkl6405875410.gif
2024-8-22 11:40 上傳
a) s* B( G9 v- D! a6 Y點擊上方藍色字體,關(guān)注我們 y* I5 e. c$ z: w
' `( d& v! |) g' k( _+ |
圖中,信號編號在1到31之間的信號被定義為不可靠信號(非實時信號)。這些信號主要繼承自早期的UNIX系統(tǒng),使用了最初設(shè)計的簡單信號機制。在這種機制中,如果一個信號在進程處理另一個相同信號時到達,該信號可能會被丟失,從而導(dǎo)致進程錯過某些事件。信號編號在34到64之間的信號被定義為可靠信號(實時信號)。與不可靠信號不同,可靠信號支持排隊處理,即使多個相同信號在處理過程中到達,它們也不會被丟失,而是按照到達順序依次處理。
3 D: A5 T3 T5 b9 T& T" ~$ Y3 Y/ g5 V/ c1 M9 G$ U
值得注意的是,可靠信號(實時信號)并沒有像不可靠信號那樣的具體名稱,而是采用了相對編號的方式來表示。這些信號使用SIGRTMIN+N或SIGRTMAX-N的形式進行表示,其中:
) E+ Y( H, g. n- ?: N) kSIGRTMIN是可靠信號(實時信號)的最小編號,通常為34。SIGRTMAX是可靠信號(實時信號)的最大編號,通常為64。
) [5 R5 m5 x k% ?6 T) a) M- V8 F# Q! O% X3 R
因此,SIGRTMIN+1代表編號為35的可靠信號(實時信號),SIGRTMAX-1代表編號為63的可靠信號(實時信號)。3 N! L3 R# Y5 c9 n$ c% @
1
* p/ C* z8 z& x& z不可靠信號與可靠信號 n j* `3 S: D* r' U, r* t
1.1、不可靠信號* N; k) ]* V M
早期UNIX系統(tǒng)中的信號機制被稱為不可靠信號,Linux的信號機制基本上繼承自早期UNIX系統(tǒng)。所以信號機制設(shè)計相對簡單,雖然實現(xiàn)了基本的進程間通信功能,但在實際應(yīng)用中暴露出一些顯著問題。+ N/ j6 A; C, L: n
I2 d5 F- T9 H; g, Z# s其主要問題包括:
' o4 i7 j; w5 S A7 `8 V信號處理后恢復(fù)默認行為3 R+ E/ _! _5 N% ~# ~* \
在早期的UNIX中,進程每次處理完信號后,系統(tǒng)會自動將該信號的處理方式恢復(fù)為默認操作。3 k% N' h8 t3 o
這意味著,如果用戶希望持續(xù)使用自定義的信號處理函數(shù),就需要在信號處理函數(shù)的末尾再次調(diào)用signal()函數(shù)重新綁定處理函數(shù)。
! P" Y" w$ [& }2 {( L7 i& s這種機制增加了編程的復(fù)雜性,并且容易導(dǎo)致程序員在忽略這個步驟時發(fā)生錯誤。信號可能丟失0 W F6 } Y+ [$ s
另一個更嚴(yán)重的問題是不可靠信號可能會丟失。
- p/ ~7 g8 O1 W& }, Y( t) k當(dāng)進程正在處理一個信號時,如果相同類型的另一個信號到達,第二個信號可能會被直接丟棄,導(dǎo)致進程錯過了重要的事件。4 X& L- ?' N4 x* K
這在關(guān)鍵任務(wù)應(yīng)用中尤其危險。% P1 K. }/ V5 Z& r. {. z
' F* p. }1 e: F7 [: Q
雖然Linux仍然支持不可靠信號機制,但對其進行了改進。Linux修復(fù)了在信號處理函數(shù)執(zhí)行后必須手動重新綁定處理函數(shù)的問題。在現(xiàn)代Linux系統(tǒng)中,一旦信號處理函數(shù)被綁定,除非顯式更改,否則它將一直保持有效。
3 W* D9 v% ?# N2 v' E3 N) Q5 C( h& a! u& k( a
然而,信號丟失問題仍然存在。這意味著,在處理不可靠信號時,如果在信號處理期間有相同信號再次到達,該信號可能無法被捕獲。
$ l0 T5 Y S* C5 y1 W U6 C7 y/ H# O; K. \1 \, ]
1.2、可靠信號5 s: F0 y$ ] X6 B- D$ u
為了克服不可靠信號的缺陷,Linux引入了可靠信號機制?煽啃盘栔С峙抨,即使進程在處理某個信號時有新的信號到達,這些信號也不會丟失,而是被加入隊列,待當(dāng)前信號處理完成后再依次處理。4 Z# @1 x) p+ s
( {. ?3 x( [' I! ]0 K: @Linux還引入了新的信號發(fā)送函數(shù)sigqueue()和信號綁定函數(shù)sigaction(),進一步增強了信號處理的靈活性和可靠性。sigqueue()不僅可以發(fā)送信號,還可以附帶一個整數(shù)值或指針,傳遞額外的信息。sigaction()則允許更精細地控制信號的行為,替代了傳統(tǒng)的signal()函數(shù)。 t& h- J+ @* r
2! N) A9 S) u/ l- C) s) _8 f/ C
實時信號和非實時信號 `/ u$ J% D) Y9 l3 Q" k( W
Linux信號的另一種分類方式是根據(jù)實時性來區(qū)分為實時信號與非實時信號。
; z- G4 G% C% z7 L1 F" d. {
6 [6 R0 C% ^- r* t
S% g( J4 X. D1 w2.1、非實時信號6 \, H, r( a. g% y8 U6 ^+ b# x
非實時信號指的是傳統(tǒng)的、不支持排隊的信號。這類信號在早期的UNIX系統(tǒng)中得以引入,信號編號一般在1到31之間。這些信號在處理時沒有嚴(yán)格的順序保證,并且如果在處理某個信號時有相同類型的新信號到達,后者可能會被忽略或丟失。因此,這類信號被稱為不可靠信號。
4 L/ @+ J& J8 K5 ^( L. b8 p; d
3 J& w& _1 M5 L0 N2 ^$ H1 h j- @; s3 | g! f
2.2、實時信號( }' h, e7 T& t# c0 \
實時信號是為了解決非實時信號在處理可靠性方面的不足而引入的。實時信號的一個顯著特點是它們支持排隊,即使在處理某個信號期間有新的相同類型的信號到達,這些信號也不會被丟棄,而是按照到達的順序依次處理。這樣,實時信號保證了多個信號都能被正確接收和處理,因此它們被稱為可靠信號。" ]* Z4 N. \! x
1 L, X- M* t: L1 A在實際編程中,開發(fā)者應(yīng)當(dāng)根據(jù)應(yīng)用需求選擇合適的信號類型。對于簡單的進程間通信或用戶交互,標(biāo)準(zhǔn)的非實時信號可能已經(jīng)足夠。而對于需要保證信號處理順序且不能丟失的重要任務(wù),使用可靠信號或?qū)崟r信號是更好的選擇。
; T# [6 X9 n0 _, X" z2 U9 Z4 K! s# c% y, \
2psq5klev0j6405875510.jpg (71.14 KB, 下載次數(shù): 1)
下載附件
保存到相冊
2psq5klev0j6405875510.jpg
2024-8-22 11:40 上傳
! w! l& Q6 W$ ~" ^3 H
xquwevprfpn6405875610.gif (45.46 KB, 下載次數(shù): 0)
下載附件
保存到相冊
xquwevprfpn6405875610.gif
2024-8-22 11:40 上傳
2 E* W4 ^( I0 A: j點擊閱讀原文,更精彩~ |
|