APUE第十章 訊號

2021-08-07 01:44:39 字數 1484 閱讀 4286

同步:乙個程序在執行某個請求的時候,若該請求需要一段時間才能返回資訊,那麼這個程序將會一直等待下去,直到搜到返回資訊才繼續執行。

非同步:乙個程序在執行某個請求的時候,不需要一直等下去,而是繼續執行之後的操作,有訊息返回時系統會通知程序進行處理。

同步和非同步關注的是程序之間的訊息通訊機制,區別阻塞和非阻塞關注程序等待呼叫結果時的狀態。

訊號(signal)是軟體中斷。訊號的作用:

首先搞清楚硬中斷、軟終端和訊號的區別。

硬中斷是外部裝置對cpu的中斷,分為「上半部」和「下半部」兩個階段:上半部在遮蔽中斷的上下文中執行,用於完成關鍵性的處理動作;而下半部則相對來說並不是非常緊急的,而且不在中斷服務上下文中執行。

軟中斷是硬中斷服務程式對核心的中斷,利用硬體中斷的概念,用軟體方式進行模擬,是硬體中斷的下半部(bottom half)。

軟中斷一般是指由指令int引起的「偽」中斷動作——給cpu製造乙個中斷的假象;而硬中斷則是實實在在由8259的連線觸發的中斷。

訊號是由核心(或其他程序)對某個程序的中斷,訊號用來通知程序發生了非同步事件,程序之間可以互相通過系統呼叫kill傳送軟中斷訊號。核心也可以因為內部事件而給程序傳送訊號,通知程序發生了某個事件。注意,訊號只是用來通知某程序發生了什麼事件,並不給該程序傳遞任何資料。

注:不能簡單地講軟中斷和訊號混為一談。軟中斷是指通過系統呼叫陷入核心態,而訊號處理通常中斷程序,雖然我們發現訊號,找到訊號處理函式的時刻處於核心態中,但是我們需要從核心態跑到使用者態去執行訊號處理程式,執行完畢後還要返回核心態

程序對訊號的處理:

忽略此訊號。

執行該訊號的預設處理動作。

捕捉訊號提供乙個訊號處理函式,要求核心在處理該訊號時切換到使用者態執行這個處理函 數,這種方式稱為捕捉(catch)乙個訊號。

訊號與中斷的相似點:

(1)採用了相同的非同步通訊方式;

(2)當檢測出有訊號或中斷請求時,都暫停正在執行的程式而轉去執行相應的處理程式;

(3)都在處理完畢後返回到原來的斷點;

(4)對訊號或中斷都可進行遮蔽。

訊號與中斷的區別:

(1)中斷有優先順序,而訊號沒有優先順序,所有的訊號都是平等的;

(2)訊號處理程式是在使用者態下執行的,而中斷處理程式是在核心態下執行;

(3)中斷響應是及時的,而訊號響應通常都有較大的時間延遲。

unix系統訊號機制最簡單的介面是signal函式。

#include 

void (*signal(int signo, void (*func))(int);

signo引數是訊號名,func值是常量sig_ign(忽略此訊號)、常量sig_dfl(執行預設操作)或當接到次訊號後要呼叫的函式的位址(捕捉訊號)

《APUE》讀書筆記 第十章訊號(上)

訊號時軟中斷,很多比較重要的應用程式都需要處理訊號,訊號提供了一種處理非同步事件的方法。每個訊號都乙個名字,以sig開頭,在標頭檔案中定義訊號型別,都是正整數 訊號編號 產生訊號的條件 1 當使用者按某些終端鍵時,引發終端產生的訊號。2 硬體異常產生訊號。3 程序呼叫kill函式將訊號傳送給另外乙個...

第十章 訊號(十九) sleep函式

我們已經在本文許多例子裡使用了sleep函式,並在10.10節給出兩個有缺陷的實現。include unsigned int sleep unsigned int seconds 返回0或未睡眠的秒數。這個函式導致呼叫程序被掛起,直到下面某種情況發生 1 seconds指定的掛鐘時間量已經逝去 2 ...

第十章 函式

使用def關鍵字 定義個數可變的位置形參 定義個數可變的關鍵字形參 定義預設值引數 定義個數可變的位置形參 deffun1 args 結果為乙個元組 print args fun1 10,20,30 10,20,30 定義個數可變的關鍵字形參 deffun2 args 結果為乙個字典 print a...