sigsuspend 函式 解釋

2021-07-11 16:33:13 字數 1456 閱讀 3571

sigsuspend函式作用 :如果在等待訊號發生時希望去休眠,則使用sigsuspend函式是非常合適的

標頭檔案:#include

乙個保護臨界區**的錯誤例項:(sigprocmask()和pause()實現)

#include #include #include void handler(int sig)    //訊號處理函式的實現

int main()

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

如果在訊號阻塞時將其傳送給程序,那麼該訊號的傳遞就被推遲直到對它解除了阻塞。對應用程式而言,該訊號好像發生在解除對sigint的阻塞和pause之間。如果發生了這種情況,或者如果在解除阻塞時刻和pause之間確實發生了訊號,那麼就產生了問題。因為我們可能不會再見到該訊號,所以從這種意義上而言,在此時間視窗(解除阻塞和pause之間)中發生的訊號丟失了,這樣就使pause永遠阻塞。

為了糾正此問題,需要在乙個原子操作中先恢復訊號遮蔽字,然後使程序休眠

。這種功能是由sigsuspend函式提供的。

#include int sigsuspend( const sigset_t *sigmask );

返回值:-1,並將errno設定為eintr

將程序的訊號遮蔽字設定為由sigmask指向的值。在捕捉到乙個訊號或發生了乙個會終止該程序的訊號之前,該程序被掛起。如果捕捉到乙個訊號而且從該訊號處理程式返回,則sigsuspend返回,並且將該程序的訊號遮蔽字設定為呼叫sigsuspend之前的值。

注意,此函式沒有成功返回值。如果它返回到呼叫者,則總是返回-1,並將errno設定為eintr(表示乙個被中斷的系統呼叫)。

3)使用sigsuspend()的程式

#include #include #include void handler(int sig)   //訊號處理程式

int main()

sigsuspend的原子操作是:

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

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

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

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

注:sigsuspend實際是將sigprocmask和pause結合起來原子操作。

**: 和

sigsuspend函式和sigwait函式

include int sigsuspend const sigset t mask sigsuspend函式是等待某個訊號到達,然後呼叫處理函式之後才返回的,否則會處於阻塞等待狀態。unix環境高階程式設計的sleep函式就是通過alarm函式和sigsuspend函式來實現的。但是當我自己寫了乙...

sigsuspend 函式作用詳解

看到網上大部分解釋都是抄來抄去的,結果說不清楚,最後還是不理解,於是花了幾個小時研究了下,感覺大體上明白了。希望本文能對你有用處。1 標頭檔案 include 2 乙個保護臨界區 的錯誤例項 sigprocmask 和pause 實現 include include include void han...

pack unpack 函式解釋

函式名 pack 呼叫語法 formatstr pack packformat,list 解說把乙個列表或陣列以在實際機器存貯格式或c等程式語言使用的格式轉化 包裝 到乙個簡單變數中。引數packformat包含乙個或多個格式字元,列表中每個元素對應乙個,各格式字元間可用空格或tab隔開,因為pac...