|
vo1kjqzvhe46402632405.gif (60.41 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
vo1kjqzvhe46402632405.gif
2024-8-20 11:37 上傳
2 P5 J# x& X; y9 i點(diǎn)擊上方藍(lán)色字體,關(guān)注我們
5 v5 I' \9 P9 b( d- I
/ i7 y: R$ R. `0 @5 R圖中,信號(hào)編號(hào)在1到31之間的信號(hào)被定義為不可靠信號(hào)(非實(shí)時(shí)信號(hào))。這些信號(hào)主要繼承自早期的UNIX系統(tǒng),使用了最初設(shè)計(jì)的簡(jiǎn)單信號(hào)機(jī)制。在這種機(jī)制中,如果一個(gè)信號(hào)在進(jìn)程處理另一個(gè)相同信號(hào)時(shí)到達(dá),該信號(hào)可能會(huì)被丟失,從而導(dǎo)致進(jìn)程錯(cuò)過(guò)某些事件。信號(hào)編號(hào)在34到64之間的信號(hào)被定義為可靠信號(hào)(實(shí)時(shí)信號(hào))。與不可靠信號(hào)不同,可靠信號(hào)支持排隊(duì)處理,即使多個(gè)相同信號(hào)在處理過(guò)程中到達(dá),它們也不會(huì)被丟失,而是按照到達(dá)順序依次處理。! O1 x; Y5 z' K6 c5 u8 H9 H& ~
* C- E/ e8 R. T: Q0 F& b值得注意的是,可靠信號(hào)(實(shí)時(shí)信號(hào))并沒(méi)有像不可靠信號(hào)那樣的具體名稱,而是采用了相對(duì)編號(hào)的方式來(lái)表示。這些信號(hào)使用SIGRTMIN+N或SIGRTMAX-N的形式進(jìn)行表示,其中:& |; `9 I7 e, L2 l/ S, B
SIGRTMIN是可靠信號(hào)(實(shí)時(shí)信號(hào))的最小編號(hào),通常為34。SIGRTMAX是可靠信號(hào)(實(shí)時(shí)信號(hào))的最大編號(hào),通常為64。
& f; b, z2 V2 h' U9 X" Z$ d" I. {3 q# C
因此,SIGRTMIN+1代表編號(hào)為35的可靠信號(hào)(實(shí)時(shí)信號(hào)),SIGRTMAX-1代表編號(hào)為63的可靠信號(hào)(實(shí)時(shí)信號(hào))。6 H% W& o. _/ w J, t" Y' r$ x
1
+ ~5 o0 }; o# r不可靠信號(hào)與可靠信號(hào)
! x, x# |8 e* T5 H; O1.1、不可靠信號(hào)
# q! h) B8 T0 @/ F早期UNIX系統(tǒng)中的信號(hào)機(jī)制被稱為不可靠信號(hào),Linux的信號(hào)機(jī)制基本上繼承自早期UNIX系統(tǒng)。所以信號(hào)機(jī)制設(shè)計(jì)相對(duì)簡(jiǎn)單,雖然實(shí)現(xiàn)了基本的進(jìn)程間通信功能,但在實(shí)際應(yīng)用中暴露出一些顯著問(wèn)題。4 Y3 p6 U: ^* F5 c! V7 W; L" s6 |& A f" {
) ]* N9 j6 r$ z: M. O5 z) \. \- N" p' y
其主要問(wèn)題包括:4 M7 ?4 q {9 O! V* n
信號(hào)處理后恢復(fù)默認(rèn)行為
. h2 H3 H0 }* i- t 在早期的UNIX中,進(jìn)程每次處理完信號(hào)后,系統(tǒng)會(huì)自動(dòng)將該信號(hào)的處理方式恢復(fù)為默認(rèn)操作。
% O& o0 G$ I& b) H+ k2 v+ Z這意味著,如果用戶希望持續(xù)使用自定義的信號(hào)處理函數(shù),就需要在信號(hào)處理函數(shù)的末尾再次調(diào)用signal()函數(shù)重新綁定處理函數(shù)。0 T. b- }* U6 X3 \8 d
這種機(jī)制增加了編程的復(fù)雜性,并且容易導(dǎo)致程序員在忽略這個(gè)步驟時(shí)發(fā)生錯(cuò)誤。信號(hào)可能丟失. F8 _2 N( c5 O! x% Z1 ~. ]( }
另一個(gè)更嚴(yán)重的問(wèn)題是不可靠信號(hào)可能會(huì)丟失。7 J) d$ W( z6 T3 O/ h' L' p, a9 L3 }
當(dāng)進(jìn)程正在處理一個(gè)信號(hào)時(shí),如果相同類型的另一個(gè)信號(hào)到達(dá),第二個(gè)信號(hào)可能會(huì)被直接丟棄,導(dǎo)致進(jìn)程錯(cuò)過(guò)了重要的事件。
* Y. ~# W4 J7 i這在關(guān)鍵任務(wù)應(yīng)用中尤其危險(xiǎn)。2 i4 o( X4 }& [( b3 V: g5 Q, A
) C3 d% G: c: s) a6 Z: w雖然Linux仍然支持不可靠信號(hào)機(jī)制,但對(duì)其進(jìn)行了改進(jìn)。Linux修復(fù)了在信號(hào)處理函數(shù)執(zhí)行后必須手動(dòng)重新綁定處理函數(shù)的問(wèn)題。在現(xiàn)代Linux系統(tǒng)中,一旦信號(hào)處理函數(shù)被綁定,除非顯式更改,否則它將一直保持有效。) J3 }6 o; p9 D; {- s, I
7 j: F: [2 i1 y2 n7 D# ^! s
然而,信號(hào)丟失問(wèn)題仍然存在。這意味著,在處理不可靠信號(hào)時(shí),如果在信號(hào)處理期間有相同信號(hào)再次到達(dá),該信號(hào)可能無(wú)法被捕獲。
, K/ R, w* e! v" O ^: i; @5 x9 M
/ }8 n9 n1 z# u, b1.2、可靠信號(hào)$ [, G: z2 Y! _3 ~3 Y6 l3 q
為了克服不可靠信號(hào)的缺陷,Linux引入了可靠信號(hào)機(jī)制。可靠信號(hào)支持排隊(duì),即使進(jìn)程在處理某個(gè)信號(hào)時(shí)有新的信號(hào)到達(dá),這些信號(hào)也不會(huì)丟失,而是被加入隊(duì)列,待當(dāng)前信號(hào)處理完成后再依次處理。
0 m3 p2 D+ [" C/ \4 V5 h6 H
2 R0 |) \( ^, h( d XLinux還引入了新的信號(hào)發(fā)送函數(shù)sigqueue()和信號(hào)綁定函數(shù)sigaction(),進(jìn)一步增強(qiáng)了信號(hào)處理的靈活性和可靠性。sigqueue()不僅可以發(fā)送信號(hào),還可以附帶一個(gè)整數(shù)值或指針,傳遞額外的信息。sigaction()則允許更精細(xì)地控制信號(hào)的行為,替代了傳統(tǒng)的signal()函數(shù)。0 C# C# t, W4 F& m+ f1 i
2
) C7 Y1 y+ D# n實(shí)時(shí)信號(hào)和非實(shí)時(shí)信號(hào)+ a! p: [+ F2 n, O7 T: j
Linux信號(hào)的另一種分類方式是根據(jù)實(shí)時(shí)性來(lái)區(qū)分為實(shí)時(shí)信號(hào)與非實(shí)時(shí)信號(hào)。$ t7 u& D% E( o# K
3 l* r) n) L+ t$ |7 n# T- i# s4 W7 ^- r9 A' K# i
2.1、非實(shí)時(shí)信號(hào)
4 x9 y* }1 d9 d; m+ _3 _$ h d非實(shí)時(shí)信號(hào)指的是傳統(tǒng)的、不支持排隊(duì)的信號(hào)。這類信號(hào)在早期的UNIX系統(tǒng)中得以引入,信號(hào)編號(hào)一般在1到31之間。這些信號(hào)在處理時(shí)沒(méi)有嚴(yán)格的順序保證,并且如果在處理某個(gè)信號(hào)時(shí)有相同類型的新信號(hào)到達(dá),后者可能會(huì)被忽略或丟失。因此,這類信號(hào)被稱為不可靠信號(hào)。
, e) p+ X+ v% ^1 s. a. a) g% R
, r; s, ]5 ^3 e' x5 j
* q: z c, c" L2.2、實(shí)時(shí)信號(hào)
1 \0 p+ J, K9 n- w" }9 D$ ?實(shí)時(shí)信號(hào)是為了解決非實(shí)時(shí)信號(hào)在處理可靠性方面的不足而引入的。實(shí)時(shí)信號(hào)的一個(gè)顯著特點(diǎn)是它們支持排隊(duì),即使在處理某個(gè)信號(hào)期間有新的相同類型的信號(hào)到達(dá),這些信號(hào)也不會(huì)被丟棄,而是按照到達(dá)的順序依次處理。這樣,實(shí)時(shí)信號(hào)保證了多個(gè)信號(hào)都能被正確接收和處理,因此它們被稱為可靠信號(hào)。
. r% \" [* t8 X" G& F- N9 W9 h, y T9 R+ d* r0 ~
在實(shí)際編程中,開(kāi)發(fā)者應(yīng)當(dāng)根據(jù)應(yīng)用需求選擇合適的信號(hào)類型。對(duì)于簡(jiǎn)單的進(jìn)程間通信或用戶交互,標(biāo)準(zhǔn)的非實(shí)時(shí)信號(hào)可能已經(jīng)足夠。而對(duì)于需要保證信號(hào)處理順序且不能丟失的重要任務(wù),使用可靠信號(hào)或?qū)崟r(shí)信號(hào)是更好的選擇。8 Q) e' T. }6 v! ^( I" l e
- |3 D& E7 |6 H" w z/ B
m3ln5asm4rx6402632505.jpg (71.14 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
m3ln5asm4rx6402632505.jpg
2024-8-20 11:37 上傳
/ m1 X# V9 [" P+ H
2a2kbvzp3hu6402632605.gif (45.46 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
2a2kbvzp3hu6402632605.gif
2024-8-20 11:37 上傳
2 A, X2 L! T. f" z5 \3 J: h& X) j- C
點(diǎn)擊閱讀原文,更精彩~ |
|