電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 77|回復(fù): 0
收起左側(cè)

嵌入式Linux:信號分類

[復(fù)制鏈接]

563

主題

563

帖子

3385

積分

四級會員

Rank: 4

積分
3385
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-8-19 12:01:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

' C  @! S. R* Z0 [( ]3 i* R" z點(diǎn)擊上方藍(lán)色字體,關(guān)注我們
0 s$ h. r8 Q4 I: c/ `6 n/ L, }. \' D8 B9 V9 L
圖中,信號編號在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á)順序依次處理。! O" B' B4 @  S( Z0 {. X6 N+ ]

6 D/ d7 S8 E- F" E+ k) j; Q$ c  |值得注意的是,可靠信號(實(shí)時(shí)信號)并沒有像不可靠信號那樣的具體名稱,而是采用了相對編號的方式來表示。這些信號使用SIGRTMIN+N或SIGRTMAX-N的形式進(jìn)行表示,其中:& ]! }, z0 W# h
  • SIGRTMIN是可靠信號(實(shí)時(shí)信號)的最小編號,通常為34。
  • SIGRTMAX是可靠信號(實(shí)時(shí)信號)的最大編號,通常為64。
    ( S+ Q! b) w8 e; F( U0 [( C

    2 [* @" t: m4 X因此,SIGRTMIN+1代表編號為35的可靠信號(實(shí)時(shí)信號),SIGRTMAX-1代表編號為63的可靠信號(實(shí)時(shí)信號)
    / n/ Q8 V6 z: T" [1
    & ^$ D4 Z5 K+ N1 B) _' c" q不可靠信號與可靠信號
    " `1 l' G( g& ?0 r1.1、不可靠信號% V- M8 m9 C( G; G8 W4 H. [
    早期UNIX系統(tǒng)中的信號機(jī)制被稱為不可靠信號,Linux的信號機(jī)制基本上繼承自早期UNIX系統(tǒng)。所以信號機(jī)制設(shè)計(jì)相對簡單,雖然實(shí)現(xiàn)了基本的進(jìn)程間通信功能,但在實(shí)際應(yīng)用中暴露出一些顯著問題。3 Q4 O9 D  T" x9 O$ V
    - p# \: G5 ]% W4 E9 q7 @% g) h
    其主要問題包括:
    . l( y( N/ y2 X" r4 {" X1 v8 H
  • 信號處理后恢復(fù)默認(rèn)行為) \+ L, z: r5 x0 g
            在早期的UNIX中,進(jìn)程每次處理完信號后,系統(tǒng)會自動將該信號的處理方式恢復(fù)為默認(rèn)操作。3 A$ \0 F7 y! D3 J6 u  U. k
    這意味著,如果用戶希望持續(xù)使用自定義的信號處理函數(shù),就需要在信號處理函數(shù)的末尾再次調(diào)用signal()函數(shù)重新綁定處理函數(shù)。6 B* Y9 w: s" A* ]& o  M
    這種機(jī)制增加了編程的復(fù)雜性,并且容易導(dǎo)致程序員在忽略這個(gè)步驟時(shí)發(fā)生錯(cuò)誤。
  • 信號可能丟失
    3 r' P) {! x! C6 E        另一個(gè)更嚴(yán)重的問題是不可靠信號可能會丟失。8 O8 a5 X8 J" c2 z
    當(dāng)進(jìn)程正在處理一個(gè)信號時(shí),如果相同類型的另一個(gè)信號到達(dá),第二個(gè)信號可能會被直接丟棄,導(dǎo)致進(jìn)程錯(cuò)過了重要的事件。. h8 H2 n6 O+ Z# i) c: J$ r
    這在關(guān)鍵任務(wù)應(yīng)用中尤其危險(xiǎn)。
    6 C% Y1 k/ P1 j" x. a
    + I% E- w- J% X
    雖然Linux仍然支持不可靠信號機(jī)制,但對其進(jìn)行了改進(jìn)。Linux修復(fù)了在信號處理函數(shù)執(zhí)行后必須手動重新綁定處理函數(shù)的問題。在現(xiàn)代Linux系統(tǒng)中,一旦信號處理函數(shù)被綁定,除非顯式更改,否則它將一直保持有效。
    4 L. l& L6 p* Q
    % R# t+ b0 w! o8 N9 D, n! x然而,信號丟失問題仍然存在。這意味著,在處理不可靠信號時(shí),如果在信號處理期間有相同信號再次到達(dá),該信號可能無法被捕獲。
    4 ]4 t  g3 k; P9 o* H; `
    4 m, m1 V  t1 A* x  s1.2、可靠信號- D, U  ^3 V- k$ r* h. _0 O( u
    為了克服不可靠信號的缺陷,Linux引入了可靠信號機(jī)制。可靠信號支持排隊(duì),即使進(jìn)程在處理某個(gè)信號時(shí)有新的信號到達(dá),這些信號也不會丟失,而是被加入隊(duì)列,待當(dāng)前信號處理完成后再依次處理。! ?+ ~2 c2 r' L$ r7 G/ A
    , s. _/ y% @# K$ A% H! b, q
    Linux還引入了新的信號發(fā)送函數(shù)sigqueue()和信號綁定函數(shù)sigaction(),進(jìn)一步增強(qiáng)了信號處理的靈活性和可靠性。sigqueue()不僅可以發(fā)送信號,還可以附帶一個(gè)整數(shù)值或指針,傳遞額外的信息。sigaction()則允許更精細(xì)地控制信號的行為,替代了傳統(tǒng)的signal()函數(shù)。+ q: ^6 U9 D$ u1 |8 r% G
    2+ U3 f# U  V0 R. }# F% T+ w
    實(shí)時(shí)信號和非實(shí)時(shí)信號
    8 ~0 b& ~* f0 y( N: w5 d: b# O+ PLinux信號的另一種分類方式是根據(jù)實(shí)時(shí)性來區(qū)分為實(shí)時(shí)信號非實(shí)時(shí)信號。! l7 d7 k6 {+ ~6 ]7 w4 h

    8 V" h' A! h% S9 X' M. }# |
    . M+ Z0 m% C2 _0 O+ }2 R( T
    2.1、非實(shí)時(shí)信號6 ~3 p/ T3 E& G) m/ N4 I
    非實(shí)時(shí)信號指的是傳統(tǒng)的、不支持排隊(duì)的信號。這類信號在早期的UNIX系統(tǒng)中得以引入,信號編號一般在1到31之間。這些信號在處理時(shí)沒有嚴(yán)格的順序保證,并且如果在處理某個(gè)信號時(shí)有相同類型的新信號到達(dá),后者可能會被忽略或丟失。因此,這類信號被稱為不可靠信號- _+ ], V( u; V$ p0 b% D7 F
    ) e& i4 ?# O3 T0 t! Y% `& i9 O
    : f- s0 U3 ^, i% L
    2.2、實(shí)時(shí)信號/ y! r: H( Y4 f
    實(shí)時(shí)信號是為了解決非實(shí)時(shí)信號在處理可靠性方面的不足而引入的。實(shí)時(shí)信號的一個(gè)顯著特點(diǎn)是它們支持排隊(duì),即使在處理某個(gè)信號期間有新的相同類型的信號到達(dá),這些信號也不會被丟棄,而是按照到達(dá)的順序依次處理。這樣,實(shí)時(shí)信號保證了多個(gè)信號都能被正確接收和處理,因此它們被稱為可靠信號。
    6 M. `7 u/ P, Q# m: M; b0 _* g2 ~* G2 b# l4 b) |
    在實(shí)際編程中,開發(fā)者應(yīng)當(dāng)根據(jù)應(yīng)用需求選擇合適的信號類型。對于簡單的進(jìn)程間通信或用戶交互,標(biāo)準(zhǔn)的非實(shí)時(shí)信號可能已經(jīng)足夠。而對于需要保證信號處理順序且不能丟失的重要任務(wù),使用可靠信號或?qū)崟r(shí)信號是更好的選擇。
    : c, O! s& I' l) ]4 L0 _% e* d9 k$ {% h- I3 ?5 m0 n8 ~
    7 K9 K5 {, d( R# L5 g
    0 q( }+ W) X& [8 l7 @
    點(diǎn)擊閱讀原文,更精彩~
  • 發(fā)表回復(fù)

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表