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

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

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

嵌入式Linux:信號(hào)分類

[復(fù)制鏈接]

563

主題

563

帖子

3385

積分

四級(jí)會(huì)員

Rank: 4

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

( h* u# U& l$ X1 X0 i點(diǎn)擊上方藍(lán)色字體,關(guān)注我們
0 D4 _6 e3 }' N) o
/ A4 ?  @5 K" ]- G圖中,信號(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ò)過某些事件。信號(hào)編號(hào)在34到64之間的信號(hào)被定義為可靠信號(hào)(實(shí)時(shí)信號(hào))。與不可靠信號(hào)不同,可靠信號(hào)支持排隊(duì)處理,即使多個(gè)相同信號(hào)在處理過程中到達(dá),它們也不會(huì)被丟失,而是按照到達(dá)順序依次處理。
8 \4 v9 H1 c1 q$ Q% f& `7 [1 P, Y8 _* g' ]9 w: j! p
值得注意的是,可靠信號(hào)(實(shí)時(shí)信號(hào))并沒有像不可靠信號(hào)那樣的具體名稱,而是采用了相對(duì)編號(hào)的方式來表示。這些信號(hào)使用SIGRTMIN+N或SIGRTMAX-N的形式進(jìn)行表示,其中:) C& M( |. _" D$ S' |/ r7 V' w
  • SIGRTMIN是可靠信號(hào)(實(shí)時(shí)信號(hào))的最小編號(hào),通常為34。
  • SIGRTMAX是可靠信號(hào)(實(shí)時(shí)信號(hào))的最大編號(hào),通常為64。
    9 Z' H* |2 p5 p' \/ B4 r- `- u
    2 w6 i% E8 q. Y; O' o; Y: |! P! S
    因此,SIGRTMIN+1代表編號(hào)為35的可靠信號(hào)(實(shí)時(shí)信號(hào)),SIGRTMAX-1代表編號(hào)為63的可靠信號(hào)(實(shí)時(shí)信號(hào))。& j( l& S( t8 s* z. a/ ?
    1
    & M# \5 G  i, D) P8 @不可靠信號(hào)與可靠信號(hào)% B0 r4 n* U' r! B$ B5 P
    1.1、不可靠信號(hào)
    9 ^4 @* f0 W/ V: g- C, R( y# P! z$ h# m早期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)用中暴露出一些顯著問題。
    2 _/ A# k! @+ w. d1 Q% F
    0 o7 J% R( B  |  y. S2 i其主要問題包括:) S, q& B0 k* t
  • 信號(hào)處理后恢復(fù)默認(rèn)行為7 s5 h# X- E4 k! f. `
            在早期的UNIX中,進(jìn)程每次處理完信號(hào)后,系統(tǒng)會(huì)自動(dòng)將該信號(hào)的處理方式恢復(fù)為默認(rèn)操作。7 P, B/ M( Y; [5 o' ?
    這意味著,如果用戶希望持續(xù)使用自定義的信號(hào)處理函數(shù),就需要在信號(hào)處理函數(shù)的末尾再次調(diào)用signal()函數(shù)重新綁定處理函數(shù)。
    7 I; ?, H$ s" o- T  U# d: G這種機(jī)制增加了編程的復(fù)雜性,并且容易導(dǎo)致程序員在忽略這個(gè)步驟時(shí)發(fā)生錯(cuò)誤。
  • 信號(hào)可能丟失
    4 B2 D! \- r. H% H        另一個(gè)更嚴(yán)重的問題是不可靠信號(hào)可能會(huì)丟失。3 ^- G' y/ Z- v! P0 F1 |% g
    當(dāng)進(jìn)程正在處理一個(gè)信號(hào)時(shí),如果相同類型的另一個(gè)信號(hào)到達(dá),第二個(gè)信號(hào)可能會(huì)被直接丟棄,導(dǎo)致進(jìn)程錯(cuò)過了重要的事件。
    / f7 W$ U# g5 K/ k$ T這在關(guān)鍵任務(wù)應(yīng)用中尤其危險(xiǎn)。2 `: y- M; t4 B' F% }$ M' M0 ^' O& _

    ; K4 g" k+ |; T0 m% ~雖然Linux仍然支持不可靠信號(hào)機(jī)制,但對(duì)其進(jìn)行了改進(jìn)。Linux修復(fù)了在信號(hào)處理函數(shù)執(zhí)行后必須手動(dòng)重新綁定處理函數(shù)的問題。在現(xiàn)代Linux系統(tǒng)中,一旦信號(hào)處理函數(shù)被綁定,除非顯式更改,否則它將一直保持有效。
    8 f" _) V3 a5 |& h! i1 J" U' a' R) S5 F6 h8 B$ y7 |+ t3 U! W" d
    然而,信號(hào)丟失問題仍然存在。這意味著,在處理不可靠信號(hào)時(shí),如果在信號(hào)處理期間有相同信號(hào)再次到達(dá),該信號(hào)可能無法被捕獲。
    4 e# h3 Z  `& D+ K4 ^
    1 w( w* A- h7 t1.2、可靠信號(hào)
    , q# ^4 H4 e: b為了克服不可靠信號(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)處理完成后再依次處理。
    3 m! e; y  P# y
    / J  v* Z) f7 w! x* }Linux還引入了新的信號(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ù)。
    : s+ F2 n; \1 c# F/ Y) D2
    4 E/ V0 O6 H' H+ O6 S, X7 B- \4 @實(shí)時(shí)信號(hào)和非實(shí)時(shí)信號(hào)
    0 q' x; D0 U4 X2 ~7 ~9 z: G& sLinux信號(hào)的另一種分類方式是根據(jù)實(shí)時(shí)性來區(qū)分為實(shí)時(shí)信號(hào)非實(shí)時(shí)信號(hào)。+ W9 {, b4 H# _3 W% N

    " C% G8 L" N- c- x

    8 y. o' c/ c+ E# E  {2.1、非實(shí)時(shí)信號(hào)2 o' X& r7 O4 ?4 V; m' W* Y# U
    非實(shí)時(shí)信號(hào)指的是傳統(tǒng)的、不支持排隊(duì)的信號(hào)。這類信號(hào)在早期的UNIX系統(tǒng)中得以引入,信號(hào)編號(hào)一般在1到31之間。這些信號(hào)在處理時(shí)沒有嚴(yán)格的順序保證,并且如果在處理某個(gè)信號(hào)時(shí)有相同類型的新信號(hào)到達(dá),后者可能會(huì)被忽略或丟失。因此,這類信號(hào)被稱為不可靠信號(hào)。
    7 t. P0 _8 K- ?# r( a' x2 W
    ) n0 w& @9 K/ ^8 A6 x+ `

    * D; d! @' L8 X2.2、實(shí)時(shí)信號(hào)" i; I2 Z( E( a: G" i0 [
    實(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)1 [8 ~+ B5 @5 N1 l0 `  a
    7 k0 D/ D! M: Z3 _9 q: w# @
    在實(shí)際編程中,開發(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)是更好的選擇。
    ) r  b9 a: \7 N* L& a" k& U: g8 Z
    5 [( D7 M/ P/ k7 {( P9 U1 `
      F+ `6 L+ R8 x! i! b + h, @( y6 T- i" i& D
    點(diǎn)擊閱讀原文,更精彩~
  • 發(fā)表回復(fù)

    本版積分規(guī)則


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