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

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

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

嵌入式Linux:信號分類

[復制鏈接]

563

主題

563

帖子

3385

積分

四級會員

Rank: 4

積分
3385
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-8-19 12:01:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
4 _( h0 z  @8 Y3 ]6 p
點擊上方藍色字體,關注我們& p5 q" Z  N, Z( Z4 e

$ V% G5 s1 ~8 M5 |圖中,信號編號在1到31之間的信號被定義為不可靠信號(非實時信號)。這些信號主要繼承自早期的UNIX系統(tǒng),使用了最初設計的簡單信號機制。在這種機制中,如果一個信號在進程處理另一個相同信號時到達,該信號可能會被丟失,從而導致進程錯過某些事件。信號編號在34到64之間的信號被定義為可靠信號(實時信號)。與不可靠信號不同,可靠信號支持排隊處理,即使多個相同信號在處理過程中到達,它們也不會被丟失,而是按照到達順序依次處理。
9 e8 J# l9 ]/ ]4 T. y
* R6 D4 F0 ]9 f/ N值得注意的是,可靠信號(實時信號)并沒有像不可靠信號那樣的具體名稱,而是采用了相對編號的方式來表示。這些信號使用SIGRTMIN+N或SIGRTMAX-N的形式進行表示,其中:
3 e$ L- v* |& I2 z9 N; B# _6 e/ I8 D* m
  • SIGRTMIN是可靠信號(實時信號)的最小編號,通常為34。
  • SIGRTMAX是可靠信號(實時信號)的最大編號,通常為64。
    8 v; Q& r; w, j8 V2 l

    + A5 d$ ~& O( ^4 t$ g" Z) E: S因此,SIGRTMIN+1代表編號為35的可靠信號(實時信號),SIGRTMAX-1代表編號為63的可靠信號(實時信號)。4 H2 }: u# `+ y
    1
    2 n0 h; r8 M; ^4 y不可靠信號與可靠信號" X8 X" ]% r' x; y% [: C2 |" b
    1.1、不可靠信號# r" ?; ?4 ]- x( ]4 k6 W2 p( F
    早期UNIX系統(tǒng)中的信號機制被稱為不可靠信號,Linux的信號機制基本上繼承自早期UNIX系統(tǒng)。所以信號機制設計相對簡單,雖然實現(xiàn)了基本的進程間通信功能,但在實際應用中暴露出一些顯著問題。
    7 q7 ?0 _% u( P4 w" z# z3 u3 g- {) _- @) \% F0 x2 ^
    其主要問題包括:
    1 W* f: t- I$ d, F
  • 信號處理后恢復默認行為
    5 [4 F& f+ A% ?$ |# T# _& `" v1 F* p        在早期的UNIX中,進程每次處理完信號后,系統(tǒng)會自動將該信號的處理方式恢復為默認操作。7 x( Q; p4 h3 T( b, }
    這意味著,如果用戶希望持續(xù)使用自定義的信號處理函數(shù),就需要在信號處理函數(shù)的末尾再次調(diào)用signal()函數(shù)重新綁定處理函數(shù)。, Z( l2 l% H! K% }/ N) @' [& V
    這種機制增加了編程的復雜性,并且容易導致程序員在忽略這個步驟時發(fā)生錯誤。
  • 信號可能丟失
    ' b7 {5 p% ~# {1 ^        另一個更嚴重的問題是不可靠信號可能會丟失。0 C9 g: Q5 X/ T- r0 ^; g% U4 H
    當進程正在處理一個信號時,如果相同類型的另一個信號到達,第二個信號可能會被直接丟棄,導致進程錯過了重要的事件。& j/ F6 e  m3 L+ N0 x5 E: w6 g
    這在關鍵任務應用中尤其危險。$ U( U) c/ C& m9 G. k7 M  \
    : H! _$ x  n2 g
    雖然Linux仍然支持不可靠信號機制,但對其進行了改進。Linux修復了在信號處理函數(shù)執(zhí)行后必須手動重新綁定處理函數(shù)的問題。在現(xiàn)代Linux系統(tǒng)中,一旦信號處理函數(shù)被綁定,除非顯式更改,否則它將一直保持有效。
    % \4 b0 o* H! S9 q
    1 F& e: }$ `/ N然而,信號丟失問題仍然存在。這意味著,在處理不可靠信號時,如果在信號處理期間有相同信號再次到達,該信號可能無法被捕獲。
    8 L% S4 u8 ?% m9 p8 p! D* D% n* j( r. j2 E# [& d8 d2 m% v
    1.2、可靠信號
    $ d6 y( q: a( k5 A為了克服不可靠信號的缺陷,Linux引入了可靠信號機制?煽啃盘栔С峙抨,即使進程在處理某個信號時有新的信號到達,這些信號也不會丟失,而是被加入隊列,待當前信號處理完成后再依次處理。
    ! @% ^; G5 i8 `+ m: J; {0 j( e4 U# b1 ]; D7 D
    Linux還引入了新的信號發(fā)送函數(shù)sigqueue()和信號綁定函數(shù)sigaction(),進一步增強了信號處理的靈活性和可靠性。sigqueue()不僅可以發(fā)送信號,還可以附帶一個整數(shù)值或指針,傳遞額外的信息。sigaction()則允許更精細地控制信號的行為,替代了傳統(tǒng)的signal()函數(shù)。
    % ^" w/ P9 b# x5 s1 F4 q4 Z24 O, @2 C# i2 V
    實時信號和非實時信號
    2 u* N9 Q, O$ ?2 g1 |3 A+ {! V1 N2 \Linux信號的另一種分類方式是根據(jù)實時性來區(qū)分為實時信號非實時信號。
    $ `  |# a, ?) G6 r0 u- Q3 z  _" I  Z7 P3 J2 W

    , y  S# b+ v8 q6 N3 e2.1、非實時信號; b# \" h& S, D0 w
    非實時信號指的是傳統(tǒng)的、不支持排隊的信號。這類信號在早期的UNIX系統(tǒng)中得以引入,信號編號一般在1到31之間。這些信號在處理時沒有嚴格的順序保證,并且如果在處理某個信號時有相同類型的新信號到達,后者可能會被忽略或丟失。因此,這類信號被稱為不可靠信號。
    ) U* t0 h/ ]$ _) t+ J) D) S; v* h$ O0 M; X

    7 l  T1 T2 `3 a5 _0 C+ g8 ~, ]  f2.2、實時信號& X( [" e, \( \" C+ `8 k
    實時信號是為了解決非實時信號在處理可靠性方面的不足而引入的。實時信號的一個顯著特點是它們支持排隊,即使在處理某個信號期間有新的相同類型的信號到達,這些信號也不會被丟棄,而是按照到達的順序依次處理。這樣,實時信號保證了多個信號都能被正確接收和處理,因此它們被稱為可靠信號。
    , I3 X9 x- K* S% i) H
    ! L& E9 O$ ^# R4 o4 c8 ?在實際編程中,開發(fā)者應當根據(jù)應用需求選擇合適的信號類型。對于簡單的進程間通信或用戶交互,標準的非實時信號可能已經(jīng)足夠。而對于需要保證信號處理順序且不能丟失的重要任務,使用可靠信號或?qū)崟r信號是更好的選擇。
    6 O1 D* ]) v2 _8 G
    ' a. z2 e) I. g4 a3 Q+ w
    3 J$ R' x- J& e, R- f: p& R9 {
    ( T! n$ g) I7 }5 x1 W. y# B+ u$ C點擊閱讀原文,更精彩~
  • 回復

    使用道具 舉報

    發(fā)表回復

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

    本版積分規(guī)則


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