LINUX C中sigprocmask 函式用法

2021-09-29 07:18:58 字數 2098 閱讀 2941

1、有時候不希望在接到訊號時就立即停止當前執行,去處理訊號,同時也不希望忽略該訊號,而是延時一段時間去呼叫訊號處理函式。這種情況是通過阻塞訊號實現的。

2、訊號阻塞和忽略訊號的區別。

阻塞的概念和忽略訊號是不同的。作業系統在訊號被程序解除阻塞之前不會講訊號傳遞出去,被阻塞的訊號也不會影響程序的行為,訊號只是暫時被阻止傳遞。當程序忽略乙個訊號時,訊號會被傳遞出去但程序會將訊號丟棄。

執行訊號的處理動作稱為訊號遞達(delivery),訊號從產生到遞達之間的狀態,稱為訊號未決(pending)。

程序可以選擇阻塞(block)某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序解除對此訊號的阻塞,才執行遞達的動作。注意,阻塞和忽略是不同,只要訊號被阻塞就不會遞達,而忽略是在遞達之後可選的一種處理動作。

3、訊號阻塞系統呼叫,它們的都起到阻塞的作用,它們不是協作使用的。

#include

intsigprocmask

(ubt how,

const sigset_t*set,sigset_t *oldset)

;int

sigsuspend

(const sigset_t*sigmask)

;sigprocmask設定對訊號遮蔽集內的訊號的處理方式(阻塞或不阻塞)。

引數:how:用於指定訊號修改的方式,可能選擇有三種

sig_block//將set所指向的訊號集中包含的訊號加到當前的訊號掩碼中。即訊號掩碼和set訊號集進行或操作。

sig_unblock//將set所指向的訊號集中包含的訊號從當前的訊號掩碼中刪除。即訊號掩碼和set進行與操作。

sig_setmask //將set的值設定為新的程序訊號掩碼。即set對訊號掩碼進行了賦值操作。

set:為指向訊號集的指標,在此專指新設的訊號集,如果僅想讀取現在的遮蔽值,可將其置為null。

oldset:也是指向訊號集的指標,在此存放原來的訊號集。可用來檢測訊號掩碼中存在什麼訊號。

返回說明:

成功執行時,返回0。失敗返回-

1,errno被設為einval。

程序執行到sigsuspend時,sigsuspend並不會立刻返回,程序處於task_interruptible狀態並立刻放棄cpu,等待unblock(mask之外的)訊號的喚醒。程序在接收到unblock(mask之外)訊號後,呼叫處理函式,然後把現在的訊號集還原為原來的,sigsuspend返回,程序恢復執行。

1)頭文1

)標頭檔案:#include

2)乙個保護臨界區**的錯誤例項:(

sigprocmask

()和pause

()實現)

#include

#include

#include

void

handler

(int sig)

//訊號處理函式的實現

intmain()

上面例項的問題是:本來期望pause()之後,來sigint訊號,可以結束程式;可是,如果當「取消阻塞」和「pause」之間,正好來了sigint訊號,結果程式因為pause的原因會一直掛起。。。

解決的方式,當然是sigsuspend()函式了。

3)使用sigsuspend()的程式

#include

#include

#include

void

handler

(int sig)

//訊號處理程式

intmain()

sigsuspend的原子操作是:

(1)設定新的mask阻塞當前程序(上面是用wait替換new,即阻塞sigusr1訊號)

(2)收到sigusr1訊號,阻塞,程式繼續掛起;收到其他訊號,恢復原先的mask(即包含sigint訊號的)。

(3)呼叫該程序設定的訊號處理函式(程式中如果先來sigusr1訊號,然後過來sigint訊號,則訊號處理函式會呼叫兩次,列印不同的內容。第一次列印sigint,第二次列印sigusr1,因為sigusr1是前面阻塞的)

(4)待訊號處理函式返回,sigsuspend返回了。(sigsuspend將捕捉訊號和訊號處理函式整合到一起了)

Linux C 中的目錄操作

linux的目錄操作一般流程為 開啟目錄 讀取目錄 中的檔案 關閉目錄。相應的函式為opendir readdir closedir,其原型都在 usr include dirent.h中定義。原型 include dir opendir const char dirname struct dire...

Linux c中的位運算

所謂的位運算指的是二進位制位的運算。在系統軟體中,常要處理二進位制位的問題。例如,將乙個儲存單元中的二進位制位左移或右移以為,兩個數按位相加等等。c語言中提供了如表1所列出的位運算子。表1 運算子含義 運算子含義 按位與 取反 按位或 左移 按位異或 右移 說明 1 位運算中除 以外,均為二目運算子...

Linux C中呼叫shell命令

很多時候我們需要在我們所編寫的c程式當中,呼叫一行命令,在命令列執行的命令,比如ifconfig,ls,或者是其他需要的命令如mpirun machinefile host np mpi並行程式 等等,這就要求我們能夠在linux下呼叫shell命令。linux的c就為我們提供了乙個可以呼叫shel...