溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Linux中信號(hào)集操作函數(shù)有哪些

發(fā)布時(shí)間:2021-10-27 11:52:24 來(lái)源:億速云 閱讀:114 作者:小新 欄目:系統(tǒng)運(yùn)維

這篇文章主要為大家展示了“Linux中信號(hào)集操作函數(shù)有哪些”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Linux中信號(hào)集操作函數(shù)有哪些”這篇文章吧。

信號(hào)從產(chǎn)生到抵達(dá)目的地,叫作信號(hào)遞達(dá)。而信號(hào)從產(chǎn)生到遞達(dá)的中間狀態(tài),叫作信號(hào)的未決狀態(tài)。產(chǎn)生未決狀態(tài)的原因有可能是信號(hào)受到阻塞了,也就是信號(hào)屏蔽字(或稱阻塞信號(hào)集,mask)對(duì)應(yīng)位被置1。阻塞信號(hào)集和未決信號(hào)集均是由內(nèi)核維護(hù)的,整個(gè)過(guò)程如下圖示:

Linux中信號(hào)集操作函數(shù)有哪些

我們有時(shí)需要屏蔽某個(gè)信號(hào),就需要去修改阻塞信號(hào)集。那么,我們?cè)撊绾涡薷淖枞盘?hào)集?系統(tǒng)提供的一個(gè)方法是,我們先創(chuàng)建一個(gè)跟阻塞信號(hào)集一樣的集合,再利用它去修改阻塞信號(hào)集。

系統(tǒng)提供了一系列的信號(hào)集設(shè)定函數(shù)。這些函數(shù)如下所示:

sigset_t  set; 信號(hào)集數(shù)據(jù)類型,本質(zhì)是typedef unsigned long sigset_t;  int sigemptyset(sigset_t *set); 將某個(gè)信號(hào)集清0 int sigfillset(sigset_t *set); 將某個(gè)信號(hào)集置1 int sigaddset(sigset_t *set, int signum); 將某個(gè)信號(hào)加入信號(hào)集int sigdelset(sigset_t *set, int signum); 將某個(gè)信號(hào)清出信號(hào)集以上幾個(gè)函數(shù)返回值均是:成功:0;失?。?1 int sigismember(const sigset_t *set, int signum); 判斷某個(gè)信號(hào)是否在信號(hào)集中返回值:在集合:1;不在:0;出錯(cuò):-1

使用以上這些函數(shù)創(chuàng)建完信號(hào)集后,要如何去改變阻塞信號(hào)集呢?系統(tǒng)又提供了一個(gè)函數(shù):sigprocmask函數(shù)。

sigprocmask函數(shù)可以用來(lái)屏蔽信號(hào),也可以用來(lái)解除屏蔽信號(hào),其本質(zhì)就是利用我們創(chuàng)建的信號(hào)集去改變阻塞信號(hào)集。

函數(shù)原型:

int sigprocmask(int how, const sigset_t set, sigset_t oldset);

返回值:

成功:0;失?。?1,設(shè)置errno

參數(shù)解釋:

  • set:傳入?yún)?shù),是一個(gè)位圖,set中哪位置1,就表示當(dāng)前進(jìn)程屏蔽哪個(gè)信號(hào)。

  • oldset:傳出參數(shù),保存舊的信號(hào)屏蔽集。這個(gè)與setitimer有點(diǎn)相似。

how參數(shù)取值:

假設(shè)當(dāng)前的信號(hào)屏蔽字為mask

  • SIG_BLOCK:當(dāng)how設(shè)置為此值,set表示需要屏蔽的信號(hào)。相當(dāng)于 mask = mask | set

  • SIG_UNBLOCK:當(dāng)how設(shè)置為此,set表示需要解除屏蔽的信號(hào)。相當(dāng)于 mask = mask & ~set

  • SIG_SETMASK:當(dāng)how設(shè)置為此,set表示用于替代原始屏蔽及的新屏蔽集。相當(dāng)于 mask = set若,調(diào)用sigprocmask解除了對(duì)當(dāng)前若干個(gè)信號(hào)的阻塞,則在sigprocmask返回前,至少將其中一個(gè)信號(hào)遞達(dá)。

我們?nèi)绾巫x取未決信號(hào)集?系統(tǒng)提供了sigpending函數(shù)。

函數(shù)原型:

int sigpending(sigset_t *set);

參數(shù)說(shuō)明:set傳出參數(shù)。

返回值:

返回值:成功:0;失敗:-1,設(shè)置errno

例:把所有常規(guī)信號(hào)的未決狀態(tài)打印至屏幕。

#include  #include  #include   void printPending(sigset_t *set) {     int i = 0;      for (i = 0; i < 32; i++) {         if (sigismember(set, i) == 1)             printf("1");         else             printf("0");     }     printf("\n"); }  int main() {     sigset_t set, oldset, pendset;     sigemptyset(&set);     sigaddset(&set, SIGQUIT);   // ctrl + \ 將產(chǎn)生SIGQUIT信號(hào)     sigprocmask(SIG_BLOCK, &set, &oldset);     while (1) {         sigpending(&pendset);         printPending(&pendset);     // 寫一個(gè)函數(shù)打印未決信號(hào)集         sleep(1);     } }

以上是“Linux中信號(hào)集操作函數(shù)有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI