訊號基礎知識 菜鳥學習日記

2021-08-17 19:56:55 字數 1780 閱讀 5963

訊號與中斷
linux訊號是一種程序間非同步的通訊機制,可以理解為是一種「軟中斷」。

訊號可以使乙個正在執行的程序被非同步打斷,然後轉而去處理乙個突發的事件。

非同步事件是不可預見的,只能通過某些特定的方式來預防,或者說,當該非同步事件發生時根據原來設定好的的相應操作去完成。

幾種常見訊號處理
訊號的安裝到登出
1、在目標程序中安裝該訊號,即設定如果程序捕獲到該訊號時執行的操作**。

2、 訊號被某個程序產生,同時設定此訊號的目的程序(一般為目標程序的pid),然後由作業系統管理。

3、訊號在目的程序被註冊。

作業系統將訊號新增到目的程序的pcb相關的資料結構中。

struct sigpending pending;

struct sigpending

//第乙個和第二個成員分別指向乙個sigqueue型別的未決訊號佇列的隊首和隊尾

//第三個成員是程序中所有未決訊號集

//sigqueue結構

struct sigqueue

簡單來說,訊號在程序中註冊指的就是將相應的訊號值加入到程序的未決訊號集中(sigpending結構的第二個成員sigset_t signal),並且將該訊號所攜帶的其它訊號資訊保留到未決訊號佇列的某個sigqueue結構體中。

只要訊號在程序的未決訊號集中,表明程序已經知道這些訊號的存在,但還沒來得及處理,或者該訊號被程序遮蔽。(函式sigpending可取當前程序的遮蔽訊號和未決訊號)

4、訊號在程序中登出

程序在執行訊號相對應的處理函式之前,首先要發此訊號在程序中登出(該訊號在只占用乙個sigqueue結構)。

目標程序在執行過程中,會檢測是不是還有訊號等待處理。程序每次從系統空間返回到使用者空間時都會做這樣的檢查。如果存在未決訊號等待處理並且該訊號沒有被程序遮蔽,則在執行該訊號相應的的處理函式前,將此訊號在未決訊號鏈中占有的結構解除安裝掉。

5、訊號登出後。

程序在訊號登出後,目的程序根據當前程序對此訊號設定的處理方式,暫時終止當前程序**的執行,保護上下文(主要包括臨時暫存器資料、當前程式位置以及當前cpu的狀態)、轉而去執行訊號的處理函式,即捕獲訊號,執行完成後再恢復到被中斷的位置繼續執行。

傳送訊號
傳送訊號是指乙個程序向另乙個程序傳送某個訊號值,但實際上並不是直接傳送的,而是有操縱系統**的。

使用者按終端鍵產生的訊號,如:在終端按「ctrl+c」,產生乙個終止訊號。這是產生中斷的一種方法

硬體異常。如:對執行乙個無效的儲存訪問的程序產生乙個sigsegv

終止程序訊號。其它程序呼叫kill()函式可將訊號傳送給另乙個程序或程序組。常用次命令終止乙個失控的程序。

軟體異常產生訊號。當檢測到某種軟體條件已經發生,並將其通知有關程序是也會產生訊號。例如,sigpipe(在管道的讀程序已終止,後乙個程序寫此管道)

下圖是使用kill命令殺死當前終端的

根據傳送訊號的不同,產生乙個訊號需要呼叫的函式也不同

python菜鳥基礎知識(一)

1.單if if 關鍵字 空格 條件 冒號 縮排 結果 print 1 if 3 2 print 9 print 8 2 if.else.二選一 if 空格 條件 冒號 縮排 結果 else 冒號 縮排 結果 n int input 請輸入數字 if 3 n print 123 else print...

LINUX 訊號 1 基礎知識

訊號是軟體中斷。很多比較重要的應用程式都需處理訊號。訊號提供了一種處理非同步事件 的方法 終端使用者鍵入中斷鍵,則會通過訊號機構停止乙個程式。1 忽略此訊號。大多數訊號都可使用這種方式進行處理,但有兩種訊號卻決不能被忽略。它們是 s i g k i l l和s i g s to p。這兩種訊號不能被...

UNIX基礎知識之訊號

本篇博文內容摘自 unix環境高階程式設計 第二版 僅作個人學習記錄所用。關於本書可參考 訊號 signal 是通知程序已發生某種情況的一種技術。例如,若某一程序執行除法操作,其除數為0,則將名為sigfpe 浮點異常 的訊號傳送給該程序。程序如果處理訊號有三種選擇 2 按系統預設方式處理。對於除以...