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

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

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

嵌入式Linux:信號分類

[復(fù)制鏈接]

563

主題

563

帖子

3385

積分

四級會員

Rank: 4

積分
3385
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-8-19 12:01:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
8 G8 ]# r9 U, k' l& d. w
點(diǎn)擊上方藍(lán)色字體,關(guān)注我們
0 s/ ?) x  N% L; N& g" [4 X
: H) }% `: S, p6 ]8 U: i* h圖中,信號編號在1到31之間的信號被定義為不可靠信號(非實(shí)時信號)。這些信號主要繼承自早期的UNIX系統(tǒng),使用了最初設(shè)計的簡單信號機(jī)制。在這種機(jī)制中,如果一個信號在進(jìn)程處理另一個相同信號時到達(dá),該信號可能會被丟失,從而導(dǎo)致進(jìn)程錯過某些事件。信號編號在34到64之間的信號被定義為可靠信號(實(shí)時信號)。與不可靠信號不同,可靠信號支持排隊處理,即使多個相同信號在處理過程中到達(dá),它們也不會被丟失,而是按照到達(dá)順序依次處理。' Q1 |- {% c/ _/ S

, m  A# R/ f2 B" {  x值得注意的是,可靠信號(實(shí)時信號)并沒有像不可靠信號那樣的具體名稱,而是采用了相對編號的方式來表示。這些信號使用SIGRTMIN+N或SIGRTMAX-N的形式進(jìn)行表示,其中:
5 h# ~$ \; c1 y; p
  • SIGRTMIN是可靠信號(實(shí)時信號)的最小編號,通常為34。
  • SIGRTMAX是可靠信號(實(shí)時信號)的最大編號,通常為64。
    % ^3 C6 d/ {! U+ C$ @+ O4 X

    - K- `2 e, h+ V; y! k因此,SIGRTMIN+1代表編號為35的可靠信號(實(shí)時信號),SIGRTMAX-1代表編號為63的可靠信號(實(shí)時信號)。
    & `5 p6 y" @  X1
    3 {, H! j8 d% n2 |2 |不可靠信號與可靠信號: w8 z. i6 [/ t, s* }0 D- M
    1.1、不可靠信號; }, X- N! Y+ q5 W" P1 P- L  M
    早期UNIX系統(tǒng)中的信號機(jī)制被稱為不可靠信號,Linux的信號機(jī)制基本上繼承自早期UNIX系統(tǒng)。所以信號機(jī)制設(shè)計相對簡單,雖然實(shí)現(xiàn)了基本的進(jìn)程間通信功能,但在實(shí)際應(yīng)用中暴露出一些顯著問題。8 R- Y, P2 ?- w3 b, T/ Z; Q) v& h* X
    2 D$ c6 ?- V' A8 X- ]
    其主要問題包括:
    . Q4 I1 d  u  o' A
  • 信號處理后恢復(fù)默認(rèn)行為
    * F4 q2 N# l) q6 t( ^/ c6 p$ v& a        在早期的UNIX中,進(jìn)程每次處理完信號后,系統(tǒng)會自動將該信號的處理方式恢復(fù)為默認(rèn)操作。8 L" `) k2 R0 |7 z. \2 d3 H9 ^
    這意味著,如果用戶希望持續(xù)使用自定義的信號處理函數(shù),就需要在信號處理函數(shù)的末尾再次調(diào)用signal()函數(shù)重新綁定處理函數(shù)。
    0 o3 [, P) O. [% a2 a7 @這種機(jī)制增加了編程的復(fù)雜性,并且容易導(dǎo)致程序員在忽略這個步驟時發(fā)生錯誤。
  • 信號可能丟失
    6 c' F: {" r0 m        另一個更嚴(yán)重的問題是不可靠信號可能會丟失。0 @# m1 ]3 z1 z" |9 G! ]4 P6 _
    當(dāng)進(jìn)程正在處理一個信號時,如果相同類型的另一個信號到達(dá),第二個信號可能會被直接丟棄,導(dǎo)致進(jìn)程錯過了重要的事件。, c9 [" v# @$ F! H  d! Q2 Q7 q, k
    這在關(guān)鍵任務(wù)應(yīng)用中尤其危險。4 I1 k- x' c, W  L
    ; t  J7 O" K- }
    雖然Linux仍然支持不可靠信號機(jī)制,但對其進(jìn)行了改進(jìn)。Linux修復(fù)了在信號處理函數(shù)執(zhí)行后必須手動重新綁定處理函數(shù)的問題。在現(xiàn)代Linux系統(tǒng)中,一旦信號處理函數(shù)被綁定,除非顯式更改,否則它將一直保持有效。% `  r; \8 D* `, q3 O! @% q
    ) [. g" A# K& F2 Y* n9 w
    然而,信號丟失問題仍然存在。這意味著,在處理不可靠信號時,如果在信號處理期間有相同信號再次到達(dá),該信號可能無法被捕獲。7 e/ M& K6 W# i. ^
    8 U  J$ \# ?+ k* f
    1.2、可靠信號) Y; w1 V8 Y4 o* F  j
    為了克服不可靠信號的缺陷,Linux引入了可靠信號機(jī)制。可靠信號支持排隊,即使進(jìn)程在處理某個信號時有新的信號到達(dá),這些信號也不會丟失,而是被加入隊列,待當(dāng)前信號處理完成后再依次處理。9 R' @' o+ {9 T# q. Q5 `0 B
    . d& z, ?. w8 k
    Linux還引入了新的信號發(fā)送函數(shù)sigqueue()和信號綁定函數(shù)sigaction(),進(jìn)一步增強(qiáng)了信號處理的靈活性和可靠性。sigqueue()不僅可以發(fā)送信號,還可以附帶一個整數(shù)值或指針,傳遞額外的信息。sigaction()則允許更精細(xì)地控制信號的行為,替代了傳統(tǒng)的signal()函數(shù)。
    * D* _; b9 s  \  h) @2+ N/ m9 h- b$ O" j: G. {/ @- x
    實(shí)時信號和非實(shí)時信號. }: O% a" U) F# ~: [3 N
    Linux信號的另一種分類方式是根據(jù)實(shí)時性來區(qū)分為實(shí)時信號非實(shí)時信號。) V0 y6 L: |2 C4 ^: R0 C% m

    ) j+ j8 H$ O+ H- z

    " N' K" a! K) Q# U2 ]5 J( s2.1、非實(shí)時信號* c) A% A1 B5 }2 N6 k0 h) o: M
    非實(shí)時信號指的是傳統(tǒng)的、不支持排隊的信號。這類信號在早期的UNIX系統(tǒng)中得以引入,信號編號一般在1到31之間。這些信號在處理時沒有嚴(yán)格的順序保證,并且如果在處理某個信號時有相同類型的新信號到達(dá),后者可能會被忽略或丟失。因此,這類信號被稱為不可靠信號。
    6 _& q1 Y, n$ c; n( H7 a+ f. G5 h2 n) z
    # _# W1 c1 o. Z
    % o# m( B& ?7 c8 n2 H
    2.2、實(shí)時信號
    3 a/ z0 r% Z5 N5 T9 z: f實(shí)時信號是為了解決非實(shí)時信號在處理可靠性方面的不足而引入的。實(shí)時信號的一個顯著特點(diǎn)是它們支持排隊,即使在處理某個信號期間有新的相同類型的信號到達(dá),這些信號也不會被丟棄,而是按照到達(dá)的順序依次處理。這樣,實(shí)時信號保證了多個信號都能被正確接收和處理,因此它們被稱為可靠信號。- Z: E& z! k9 }7 A2 d/ I

    6 j+ t' x& x6 j% w- U+ d在實(shí)際編程中,開發(fā)者應(yīng)當(dāng)根據(jù)應(yīng)用需求選擇合適的信號類型。對于簡單的進(jìn)程間通信或用戶交互,標(biāo)準(zhǔn)的非實(shí)時信號可能已經(jīng)足夠。而對于需要保證信號處理順序且不能丟失的重要任務(wù),使用可靠信號或?qū)崟r信號是更好的選擇。6 M* u; `. i/ h/ o% u7 P
    6 N/ R9 u, n  T. e3 |6 Y

    0 x3 l; }& R& g" l/ f
    8 Y5 \1 I4 H# I' l+ o點(diǎn)擊閱讀原文,更精彩~
  • 回復(fù)

    使用道具 舉報

    發(fā)表回復(fù)

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

    本版積分規(guī)則


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