阻塞訊號及訊號遮蔽pending

2021-08-02 15:32:42 字數 2335 閱讀 2630

1.訊號在核心中的三種表示

(1)訊號遞達:實際執行訊號的處理動作;

(2)訊號未決(pending):訊號從產生到遞達的狀態,是一種記錄狀態;

(3)阻塞訊號(block):被阻塞的訊號不會遞達,它在產生時處於未決狀態,直到程序解除對這個訊號的阻塞,才會執行遞達,但不會立即遞達;

阻塞與忽略的不同:忽略是在訊號遞達後的處理動作,而被阻塞的訊號是不會遞達的;

2.訊號在核心中的表示示意圖:

(1)每個pcb都包含三張表:block,pending,handler,block表和pending表有可以有相同的資料結構,是一張位圖,佔四個位元組,pending表的0、1表示是否收到訊號,block表的0、1表示是否被阻塞;

(2)每個訊號都有阻塞標誌位block、未決標誌位pending和乙個處理動作handler;

(3)訊號產生時,核心在pcb中設定未決標誌位,當訊號遞達時才清除該標誌位;

上述圖中:

①1號訊號未阻塞也未遞達;

②2號訊號被阻塞,暫時不會遞達;

③3號訊號未產生過,一旦產生將被阻塞;

3.訊號集

未決標誌和阻塞標誌可以通過相同的資料型別sigset_t儲存,叫做訊號集;

阻塞訊號集也可以叫做訊號遮蔽字;

訊號集操作有很多函式,將在下面的訊號遮蔽中進行介紹;

4.訊號遮蔽

(1)sigprocmask函式: 可以讀取或更改程序的訊號遮蔽字;

int sigprocmask(int how, const sigset_t *set , sigset_t *oset);

成功時返回0,出錯返回-1

①oset非空時,讀取程序的當前訊號遮蔽字通過pset引數傳出;

②set非空時,更改程序的訊號遮蔽字;

③兩個指標都非空時,將原來的訊號遮蔽字輸出備份至oset,並根據how和set更改訊號遮蔽字;

④how引數:

sig_block—–set包含要新增的訊號;

sig_unblock—-set包含要解除阻塞的訊號;

sig_setmask—-設定當前訊號遮蔽字為set的值;

(2)pending函式:讀取當前程序的未決訊號集

int pending(sigset_t *set);

成功時返回0,失敗時返回-1

(3)測試訊號遮蔽與解除並遞達:

最終**3可以多次傳送2號訊號並解除,遞達

①**1:

#include

#include

#include

void showpending(sigset_t *pending)

else

}printf("\n");

}int main()

}

結果如圖:

程式每秒將31個訊號的未決狀態列印一遍,按ctrl-c後第二個位元位變為1,因為2號訊號被遮蔽,不能遞達,所以不被處理。

②**2:

#include

#include

#include

void handler(int sig)

void showpending(sigset_t *pending)

else

}printf("\n");

}int main()}}

結果如圖:

}結果如圖:

Linux 訊號阻塞與遮蔽

1.sigprocmask函式提供遮蔽和解除遮蔽訊號的功能。從而實現關鍵 的執行不被打斷。函式宣告如下 int sigprocmask int how,const sigset t set,sigset t oldset 其中引數 how可設定的引數為 sig block,sig unblock,s...

linux基礎 訊號阻塞及未決訊號

未決訊號 pause的使用 訊號傳送處理過程 可重入函式 訊號處理函式的繼承 setitimer實現定時器 程序可以設定對某個訊號的阻塞 遮蔽 需要用到sigset t 訊號集 資料型別。sigemptyset 3 include int sigemptyset sigset t set 功能 將訊...

linux訊號 阻塞訊號

1.訊號在核心中的表示 我們知道了訊號產生的各種原因,而實際執行訊號處理的動作,叫做訊號遞達 delivery 訊號從產生到遞達之間的狀態,稱為訊號未決 pending 程序可以選擇阻塞 block 某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序解除對此訊號的阻塞,才執行遞達的動作。注意,阻...