<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > 嵌入式Linux:信號分類(lèi)

嵌入式Linux:信號分類(lèi)

發(fā)布人:美男子玩編程 時(shí)間:2024-09-25 來(lái)源:工程師 發(fā)布文章

在Linux系統中,信號可以從兩個(gè)不同的角度進(jìn)行分類(lèi):一是從可靠性方面,將信號分為可靠信號不可靠信號;二是從實(shí)時(shí)性方面,將信號分為實(shí)時(shí)信號非實(shí)時(shí)信號。

在 Linux 系統下使用"kill -l"命令可查看到所有信號,如下所示:



圖中,信號編號在1到31之間的信號被定義為不可靠信號(非實(shí)時(shí)信號)。這些信號主要繼承自早期的UNIX系統,使用了最初設計的簡(jiǎn)單信號機制。在這種機制中,如果一個(gè)信號在進(jìn)程處理另一個(gè)相同信號時(shí)到達,該信號可能會(huì )被丟失,從而導致進(jìn)程錯過(guò)某些事件。信號編號在34到64之間的信號被定義為可靠信號(實(shí)時(shí)信號)。與不可靠信號不同,可靠信號支持排隊處理,即使多個(gè)相同信號在處理過(guò)程中到達,它們也不會(huì )被丟失,而是按照到達順序依次處理。


值得注意的是,可靠信號(實(shí)時(shí)信號)并沒(méi)有像不可靠信號那樣的具體名稱(chēng),而是采用了相對編號的方式來(lái)表示。這些信號使用SIGRTMIN+N或SIGRTMAX-N的形式進(jìn)行表示,其中:

  • SIGRTMIN是可靠信號(實(shí)時(shí)信號)的最小編號,通常為34。

  • SIGRTMAX是可靠信號(實(shí)時(shí)信號)的最大編號,通常為64。


因此,SIGRTMIN+1代表編號為35的可靠信號(實(shí)時(shí)信號),SIGRTMAX-1代表編號為63的可靠信號(實(shí)時(shí)信號)。


1


不可靠信號與可靠信號

1.1、不可靠信號

早期UNIX系統中的信號機制被稱(chēng)為不可靠信號,Linux的信號機制基本上繼承自早期UNIX系統。所以信號機制設計相對簡(jiǎn)單,雖然實(shí)現了基本的進(jìn)程間通信功能,但在實(shí)際應用中暴露出一些顯著(zhù)問(wèn)題。


其主要問(wèn)題包括:

  • 信號處理后恢復默認行為
    在早期的UNIX中,進(jìn)程每次處理完信號后,系統會(huì )自動(dòng)將該信號的處理方式恢復為默認操作。

    這意味著(zhù),如果用戶(hù)希望持續使用自定義的信號處理函數,就需要在信號處理函數的末尾再次調用signal()函數重新綁定處理函數。

    這種機制增加了編程的復雜性,并且容易導致程序員在忽略這個(gè)步驟時(shí)發(fā)生錯誤。

  • 信號可能丟失
    另一個(gè)更嚴重的問(wèn)題是不可靠信號可能會(huì )丟失。

    當進(jìn)程正在處理一個(gè)信號時(shí),如果相同類(lèi)型的另一個(gè)信號到達,第二個(gè)信號可能會(huì )被直接丟棄,導致進(jìn)程錯過(guò)了重要的事件。

    這在關(guān)鍵任務(wù)應用中尤其危險。


雖然Linux仍然支持不可靠信號機制,但對其進(jìn)行了改進(jìn)。Linux修復了在信號處理函數執行后必須手動(dòng)重新綁定處理函數的問(wèn)題。在現代Linux系統中,一旦信號處理函數被綁定,除非顯式更改,否則它將一直保持有效。


然而,信號丟失問(wèn)題仍然存在。這意味著(zhù),在處理不可靠信號時(shí),如果在信號處理期間有相同信號再次到達,該信號可能無(wú)法被捕獲。


1.2、可靠信號

為了克服不可靠信號的缺陷,Linux引入了可靠信號機制??煽啃盘栔С峙抨?,即使進(jìn)程在處理某個(gè)信號時(shí)有新的信號到達,這些信號也不會(huì )丟失,而是被加入隊列,待當前信號處理完成后再依次處理。


Linux還引入了新的信號發(fā)送函數sigqueue()和信號綁定函數sigaction(),進(jìn)一步增強了信號處理的靈活性和可靠性。sigqueue()不僅可以發(fā)送信號,還可以附帶一個(gè)整數值或指針,傳遞額外的信息。sigaction()則允許更精細地控制信號的行為,替代了傳統的signal()函數。


2


實(shí)時(shí)信號和非實(shí)時(shí)信號

Linux信號的另一種分類(lèi)方式是根據實(shí)時(shí)性來(lái)區分為實(shí)時(shí)信號非實(shí)時(shí)信號。


2.1、非實(shí)時(shí)信號

非實(shí)時(shí)信號指的是傳統的、不支持排隊的信號。這類(lèi)信號在早期的UNIX系統中得以引入,信號編號一般在1到31之間。這些信號在處理時(shí)沒(méi)有嚴格的順序保證,并且如果在處理某個(gè)信號時(shí)有相同類(lèi)型的新信號到達,后者可能會(huì )被忽略或丟失。因此,這類(lèi)信號被稱(chēng)為不可靠信號。


2.2、實(shí)時(shí)信號

實(shí)時(shí)信號是為了解決非實(shí)時(shí)信號在處理可靠性方面的不足而引入的。實(shí)時(shí)信號的一個(gè)顯著(zhù)特點(diǎn)是它們支持排隊,即使在處理某個(gè)信號期間有新的相同類(lèi)型的信號到達,這些信號也不會(huì )被丟棄,而是按照到達的順序依次處理。這樣,實(shí)時(shí)信號保證了多個(gè)信號都能被正確接收和處理,因此它們被稱(chēng)為可靠信號。


在實(shí)際編程中,開(kāi)發(fā)者應當根據應用需求選擇合適的信號類(lèi)型。對于簡(jiǎn)單的進(jìn)程間通信或用戶(hù)交互,標準的非實(shí)時(shí)信號可能已經(jīng)足夠。而對于需要保證信號處理順序且不能丟失的重要任務(wù),使用可靠信號或實(shí)時(shí)信號是更好的選擇。


*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: 嵌入式 Linux

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>