|
hxl4strddkl6405875410.gif (60.41 KB, 下載次數(shù): 0)
下載附件
保存到相冊
hxl4strddkl6405875410.gif
2024-8-22 11:40 上傳
H/ f2 s0 F J7 }' w" j點(diǎn)擊上方藍(lán)色字體,關(guān)注我們" l' \* A* w- }: {$ b9 e0 C
' t$ Z4 ?& w/ B% d圖中,信號編號在1到31之間的信號被定義為不可靠信號(非實(shí)時(shí)信號)。這些信號主要繼承自早期的UNIX系統(tǒng),使用了最初設(shè)計(jì)的簡單信號機(jī)制。在這種機(jī)制中,如果一個(gè)信號在進(jìn)程處理另一個(gè)相同信號時(shí)到達(dá),該信號可能會被丟失,從而導(dǎo)致進(jìn)程錯(cuò)過某些事件。信號編號在34到64之間的信號被定義為可靠信號(實(shí)時(shí)信號)。與不可靠信號不同,可靠信號支持排隊(duì)處理,即使多個(gè)相同信號在處理過程中到達(dá),它們也不會被丟失,而是按照到達(dá)順序依次處理。2 z8 M6 w, C' T1 I
* }4 {4 [% n; N- M值得注意的是,可靠信號(實(shí)時(shí)信號)并沒有像不可靠信號那樣的具體名稱,而是采用了相對編號的方式來表示。這些信號使用SIGRTMIN+N或SIGRTMAX-N的形式進(jìn)行表示,其中:, T' q" e5 F5 u
SIGRTMIN是可靠信號(實(shí)時(shí)信號)的最小編號,通常為34。SIGRTMAX是可靠信號(實(shí)時(shí)信號)的最大編號,通常為64。
& {5 T+ j- a0 e6 ], G9 |4 K
* v% U$ w8 C1 Z, k& l" V* Y. q因此,SIGRTMIN+1代表編號為35的可靠信號(實(shí)時(shí)信號),SIGRTMAX-1代表編號為63的可靠信號(實(shí)時(shí)信號)。4 M m X5 e5 t; L( B6 Q' P
1
- p( s, @1 ~/ [, d# t不可靠信號與可靠信號9 c! Q& {# D% Z4 r5 L1 |& W
1.1、不可靠信號
7 q# x: J) u4 r, }/ A早期UNIX系統(tǒng)中的信號機(jī)制被稱為不可靠信號,Linux的信號機(jī)制基本上繼承自早期UNIX系統(tǒng)。所以信號機(jī)制設(shè)計(jì)相對簡單,雖然實(shí)現(xiàn)了基本的進(jìn)程間通信功能,但在實(shí)際應(yīng)用中暴露出一些顯著問題。: K/ b, O. c! C0 h" s" h g
) l7 r: }4 t1 y# G. y其主要問題包括:3 k" X# u, G. U* C
信號處理后恢復(fù)默認(rèn)行為. R; {6 E7 C( U, `- p* h
在早期的UNIX中,進(jìn)程每次處理完信號后,系統(tǒng)會自動將該信號的處理方式恢復(fù)為默認(rèn)操作。) g* O+ u9 i7 N
這意味著,如果用戶希望持續(xù)使用自定義的信號處理函數(shù),就需要在信號處理函數(shù)的末尾再次調(diào)用signal()函數(shù)重新綁定處理函數(shù)。
# L- L9 R* y8 n) J這種機(jī)制增加了編程的復(fù)雜性,并且容易導(dǎo)致程序員在忽略這個(gè)步驟時(shí)發(fā)生錯(cuò)誤。信號可能丟失
; o: U6 Q5 e" _5 U* N/ \& y/ n 另一個(gè)更嚴(yán)重的問題是不可靠信號可能會丟失。
! d( z0 F6 c* s q4 g: D) Z! m0 I當(dāng)進(jìn)程正在處理一個(gè)信號時(shí),如果相同類型的另一個(gè)信號到達(dá),第二個(gè)信號可能會被直接丟棄,導(dǎo)致進(jìn)程錯(cuò)過了重要的事件。3 H% H4 V( ~0 m
這在關(guān)鍵任務(wù)應(yīng)用中尤其危險(xiǎn)。
, E3 {; V8 ~8 k( X
- d' h4 U8 F# u" D; N5 _0 J" G( V雖然Linux仍然支持不可靠信號機(jī)制,但對其進(jìn)行了改進(jìn)。Linux修復(fù)了在信號處理函數(shù)執(zhí)行后必須手動重新綁定處理函數(shù)的問題。在現(xiàn)代Linux系統(tǒng)中,一旦信號處理函數(shù)被綁定,除非顯式更改,否則它將一直保持有效。
& r9 V9 u3 n8 `1 v* b8 R; e/ h7 H) s: M: o) P3 p- S s
然而,信號丟失問題仍然存在。這意味著,在處理不可靠信號時(shí),如果在信號處理期間有相同信號再次到達(dá),該信號可能無法被捕獲。
. L% N' C- }3 \( {( Q5 r, f! X4 ?4 ^. H8 N' r, n, w/ K4 s
1.2、可靠信號* K- G9 B, q2 Y& T ?
為了克服不可靠信號的缺陷,Linux引入了可靠信號機(jī)制?煽啃盘栔С峙抨(duì),即使進(jìn)程在處理某個(gè)信號時(shí)有新的信號到達(dá),這些信號也不會丟失,而是被加入隊(duì)列,待當(dāng)前信號處理完成后再依次處理。
; U$ r3 K0 `! l5 F5 I$ q8 x. ^8 B# \& f
Linux還引入了新的信號發(fā)送函數(shù)sigqueue()和信號綁定函數(shù)sigaction(),進(jìn)一步增強(qiáng)了信號處理的靈活性和可靠性。sigqueue()不僅可以發(fā)送信號,還可以附帶一個(gè)整數(shù)值或指針,傳遞額外的信息。sigaction()則允許更精細(xì)地控制信號的行為,替代了傳統(tǒng)的signal()函數(shù)。
$ l6 h i1 f% B# }" g; v$ U2
- s y5 I8 [* D% y實(shí)時(shí)信號和非實(shí)時(shí)信號
0 b4 ^; k3 H4 V6 eLinux信號的另一種分類方式是根據(jù)實(shí)時(shí)性來區(qū)分為實(shí)時(shí)信號與非實(shí)時(shí)信號。6 z9 {" B' V+ H( A# a2 X3 _
& \* L3 p( D3 z% p m, @4 r2 x$ x. u( a- |' b
2.1、非實(shí)時(shí)信號' ?1 ]' L' Q s* r9 ~& [
非實(shí)時(shí)信號指的是傳統(tǒng)的、不支持排隊(duì)的信號。這類信號在早期的UNIX系統(tǒng)中得以引入,信號編號一般在1到31之間。這些信號在處理時(shí)沒有嚴(yán)格的順序保證,并且如果在處理某個(gè)信號時(shí)有相同類型的新信號到達(dá),后者可能會被忽略或丟失。因此,這類信號被稱為不可靠信號。
( n$ j# j5 D6 o( }' {8 R+ R3 p+ e1 Q w `0 w' I
3 g) r0 H [3 X2.2、實(shí)時(shí)信號: b* ~2 B+ d8 Y1 `
實(shí)時(shí)信號是為了解決非實(shí)時(shí)信號在處理可靠性方面的不足而引入的。實(shí)時(shí)信號的一個(gè)顯著特點(diǎn)是它們支持排隊(duì),即使在處理某個(gè)信號期間有新的相同類型的信號到達(dá),這些信號也不會被丟棄,而是按照到達(dá)的順序依次處理。這樣,實(shí)時(shí)信號保證了多個(gè)信號都能被正確接收和處理,因此它們被稱為可靠信號。
7 a( N# N/ G$ u% ^- s, Z6 M
/ s' l. @2 C! |) a, S5 F在實(shí)際編程中,開發(fā)者應(yīng)當(dāng)根據(jù)應(yīng)用需求選擇合適的信號類型。對于簡單的進(jìn)程間通信或用戶交互,標(biāo)準(zhǔn)的非實(shí)時(shí)信號可能已經(jīng)足夠。而對于需要保證信號處理順序且不能丟失的重要任務(wù),使用可靠信號或?qū)崟r(shí)信號是更好的選擇。
+ }1 ]8 {6 c! U# h+ n% z6 u3 g, A. F7 j+ V$ j* Y t: F M* {1 c W
2psq5klev0j6405875510.jpg (71.14 KB, 下載次數(shù): 0)
下載附件
保存到相冊
2psq5klev0j6405875510.jpg
2024-8-22 11:40 上傳
( [" z5 [8 `# y. L0 M- |& c% p
xquwevprfpn6405875610.gif (45.46 KB, 下載次數(shù): 0)
下載附件
保存到相冊
xquwevprfpn6405875610.gif
2024-8-22 11:40 上傳
R3 W& m! {1 G, z j點(diǎn)擊閱讀原文,更精彩~ |
|