APUE學習 訊號(3)

2021-06-20 19:25:40 字數 2382 閱讀 7156

1、訊號集

本篇檔案介紹訊號集的概念。訊號集就是一些訊號的集合,型別是sigset_t,這個型別是不透明的,當然可以找到標頭檔案仔細研究但意義不大。該型別所涉及的操作函式如下:

[cpp]view plain

copy

intsigemptyset(sigset_t *set);  

//初始化訊號集set為空,不包含任何訊號

intsigfillset(sigset_t *set);  

//初始化訊號集set為滿,包含所有訊號

intsigaddset(sigset_t *set, 

intsigno);  

//為set訊號集中增加signo訊號

intsigdelset(sigset_t *set, 

intsigno);  

//為set訊號集中減去signo訊號

intsigismember(

const

sigeset_t *set, 

intsigno); 

//判斷set是否有訊號signo

這些操作非常簡單,唯一需要注意的是當使用乙個訊號集變數前,sigemptyset()是必須的。

訊號集的作用是方便對其中的訊號做統一的處理(避免乙個乙個訊號做處理帶來的麻煩)。第乙個應用是訊號遮蔽字,遮蔽字本身就是用訊號集描述的。

每個程序(執行緒)都擁有乙個訊號遮蔽字,訊號遮蔽字中的訊號不會到來,注意的一點是訊號遮蔽字遮蔽的並非是訊號的接受而是阻塞訊號的傳遞,也就是說訊號遮蔽字中的訊號如果產生了,會在傳遞階段阻塞直到接觸該訊號的遮蔽。設定訊號遮蔽字的函式式sigprocmask()

[cpp]view plain

copy

intsigprocmask(

inthow, 

const

sigset_t  *set, sigset_t *oldset);  

引數how,闡明了要進行的操作,包括:

sig_block增加阻塞(或操作),該程序新的訊號遮蔽字是其當前訊號遮蔽字和set指向訊號集的並集。set包含了我們希望阻塞的附加訊號。

sig_unblock減少阻塞,該程序新的訊號遮蔽字是其當前訊號遮蔽字和set所指向訊號集補集的交集。set包含了我們希望解除阻塞的訊號。

sig_setmask設定遮蔽字(賦值操作),該程序新的訊號遮蔽字將被set指向的訊號集的值代替。

引數set是設定的訊號集;引數oset是獲得設定前的訊號遮蔽字。如果引數set傳null,則不會改變遮蔽字,僅僅具有獲得遮蔽字的功能。

注意:1.不遮蔽訊號的接受而是阻塞訊號的傳遞,解除阻塞後訊號會到來(訊號沒有丟失而是未處理),在解除阻塞前被阻塞的訊號稱為未決訊號,該訊號的狀態稱為未決狀態。

2.fork()時子程序會繼承父程序的訊號遮蔽字,但之後父子程序的訊號遮蔽字互不影響

3.不能阻塞訊號sigkill sigstop(這兩個訊號不能更改處理動作),如果set中有這兩個訊號,sigprocmask也不會處理這個訊號(不返回出錯)

4.不應該阻塞sigpipe這樣的訊號,因為這些訊號是由於程式出錯而產生的

5.在乙個訊號的處理函式執行過程中,該訊號會自動加入到遮蔽字中。

剛剛提到未決訊號的概念,某一時刻可以有很多的未決訊號,這樣就構成了未決訊號集,可以通過下面的函式獲得:

[cpp]view plain

copy

intsigpending(sigset_t *set);  

set是乙個出參,獲得後可以通過sigismember(set, signo)來檢查有沒有signo訊號處於未決狀態。只能判斷有沒有不能獲得有多少個(不可靠只能有乙個,可靠可能有多個)

剛才提到,在訊號處理函式中,該訊號會自動加入到訊號遮蔽字中,當處理函式執行結束後才會解除阻塞。那如果在處理函式執行過程呼叫了longjmp()跳轉出處理函式,那該訊號不會從訊號遮蔽字中去掉,那麼該訊號會用於阻塞,解決辦法是之前提到過的sigsetjmp() siglongjmp(),它們相較於setjmp()和longjmp()增加了儲存遮蔽字的功能,在跳轉時會恢復遮蔽字。

有時,我們需要等待某乙個訊號的到來,但pause()函式會被所有訊號打斷,為了達到這種目的,方法是將別的可能到來的訊號加入到遮蔽字中然後等待特定的訊號,當訊號到達後,再解除那些增加到遮蔽字中的訊號的遮蔽。連續使用sigprocmask->pause->sigprocmask可以實現,也可以使用sigsuspend()函式

[cpp]view plain

copy

intsigsuspend(

const

sigset_t *sigmask);  

功能是用sigmask替換當前的訊號遮蔽字,掛起等待訊號,恢復呼叫前的遮蔽字。

APUE學習筆記 10 訊號概念

by 潘雲登 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 unix 環境高階程式設計 第 2版 第 10章。2.總結了有關訊號的基本概念,包括訊號產生的原因和對訊號的處理方式。3.訊號概念 訊號是軟體中斷,提供了一種處理非同步事件的方法。每個訊號都有乙個名字,以字元 si...

APUE學習筆記 13 捕捉訊號

by 潘雲登 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 unix 環境高階程式設計 第 2版 第 10章。2.總結了sigaction 函式的用法,用以替代先前捕捉訊號使用的 signal 函式。3.sigaction 前面學習過 signal 函式,使用它為某個特定訊...

APUE學習筆記 17 執行緒和訊號

by 潘雲登 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 unix 環境高階程式設計 第 2版 第 12章。2.總結了如何設定執行緒的訊號遮蔽字,以及如何使用專用線程進行訊號處理。3.執行緒的訊號遮蔽字 每個執行緒都有自己的執行緒遮蔽字,但是訊號處理函式是程序中所有執行緒...