如何實現訊號遮蔽

2021-08-03 06:25:52 字數 1654 閱讀 9238

linux中常見訊號量只有31個,所以程序pcb中表示常見的訊號量只用乙個位元組表示就夠了,程序得到了乙個訊號就是對應的乙個bit位由0改變為1。訊號被系統傳送給乙個程序,就是改變pcb中表示訊號量的位元組中對應的乙個bit位。程序收到某一訊號,相當於向表示訊號量的位元組中寫入了乙個訊號量。

關於訊號抵達,當訊號產生後會向指定程序傳送,但被傳送的訊號不會第一時間被抵達,程序也就不會產生相應的處理動作,所以訊號存在訊號未決和訊號抵達這兩種狀態;而訊號未決處於訊號產生和訊號抵達之間,所以,在訊號抵達之前會存在一種情況叫做訊號阻塞,被阻塞的訊號是永遠都不會在解除阻塞前被抵達的。

linux為了方便管理用三張表來儲存這些資訊。

block表                                    表示被阻塞的訊號(1為阻塞)

pending表                                  表示未決(1為有訊號未達)

handler表                                  表示訊號處理方式(有三種:忽略,預設,自定義)

具體關係如下表:

由表可以看出:

訊號1被遮蔽,雖然現在沒有訊號1的訊號未決情況,但就算是有訊號1 被傳送,因為被遮蔽也不會被抵達;除非解除對訊號1的遮蔽,訊號1抵達後會被忽略。

訊號2沒有被遮蔽,現在訊號2處於訊號未決情況,故訊號1 最終會被抵達執行預設動作。

訊號3被遮蔽,現在訊號3處於訊號未決情況,因為訊號3被遮蔽也就不會被抵達;除非解除對訊號3的遮蔽,訊號3抵達後會執行自定義動作。

阻塞和忽略的區別:

被阻塞的訊號永遠都不會被抵達,而忽略是訊號被抵達的一種處理動作。

同時需要知道的是,訊號抵達後只有再合適的時機到來,才會被處理,即從核心態到使用者態時。

列印pending表並驗證訊號遮蔽與解除並抵達的情況。

需要用到以下的幾個函式:

源**如下:

執行結果如下

想知道為何這樣執行,可以去看一看源**,不多解釋了。

分享如上,望共同進步!

Linux中如何遮蔽訊號

本篇文章主要學習linux的訊號處理機制,著重學習遮蔽訊號部分。遮蔽訊號處理的兩種方式類似於訊號的捕獲,一種方式是直接對其設定,另一種方式是先獲得描述符的掩碼,然後對其設定操作。本文主要參考自 嵌入式linux系統使用開發 作者何永琪,thanks.在linux系統中,如何處理某個程序傳送的乙個特定...

訊號遮蔽字

訊號遮蔽字是指乙個程序中當前阻塞而不能夠遞送給該程序的訊號集。訊號集則是乙個能表示多個訊號的集合的一種資料型別,為sigset t。與訊號集設定相關的函式有如下幾個 cpp view plain copy font size 18px include 下列四個函式成功返回0,出錯返回 1 int s...

linux 訊號遮蔽

include include include include include include sigemptyset newmask 獲取空遮蔽訊號集 sigfillset newmask 獲取遮蔽了所有訊號的遮蔽訊號集,除了那兩個sigkill sigstop sigpending pendma...