當前位置:編程學習大全網 - 編程語言 - 信號掩碼的信號集處理函數

信號掩碼的信號集處理函數

POSIX.1定義了數據類型sigset_t來表示或保存多個信號——信號集(signal set),信號掩碼就存放在這些信號集中。POSIX定義了下列5個處理信號集的函數。

int sigemptyset(sigset_t *set) 初始化由set指向的信號集,清除其中所有信號,即設置所有信號掩碼的阻塞標誌

int sigfillset(sigset_t *set) 初始化由set指向的信號集,使其包括所有信號,即清除所有信號掩碼的阻塞標誌

int sigaddset(sigset_t *set, int signo) 將壹個特定信號signo添加到set指向的信號集中,可用於增加個別信號阻塞

int sigdelset(sigset_t *set, int signo) 從set指向的信號集中刪除壹個特定信號signo,可用於刪除個別信號阻塞

int sigismember(const sigset_t *set, int signo) 檢查某個信號是否在set指向的信號集中,可確定特定的信號是否在掩碼中被標誌為阻塞。

另外,進程也可以調用sigprocmask()來檢測和更改其當前的信號掩碼,以便告訴內核不允許觸發該信號集中的信號。其實現代碼在kernel/signal.c中,原型為:

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

首先,若oset是非空指針,那麽進程的當前信號掩碼通過oset返回。

其次,若set是壹個指向信號集的非空指針,則參數how指示如何修改當前進程的信號掩碼。參數how的取值及含義如下:

SIG_BLOCK 該進程新的信號掩碼是其當前信號掩碼和set所指向信號集的並集,即set規定了我們希望阻塞的附加信號。

SIG_UNBLOCK 該進程新的信號掩碼是其當前信號掩碼和set所指向信號集的補集的交集,即set包含了我們希望解除阻塞的信號。

SIG_SETMASK 該進程新的信號掩碼將被set指向的信號集代替,即set變成該進程新的信號掩碼。

如果set是空指針,則不改變該進程的信號掩碼,how的值也無意義。用壹段代碼來說明這個邏輯:

switch (how) {

case SIG_BLOCK:

current->blocked |= set;

break;

case SIG_UNBLOCK:

current->blocked &= ~set;

break;

case SIG_SETMASK:

current->blocked = set;

break;

default:

return -EINVAL;

}

其中current表示指向當前進程結構的指針,其中包含當前進程的信號掩碼blocked。

  • 上一篇:少兒編程教育遍布全球,編程教育將是世界各國下壹場科技競爭
  • 下一篇:編寫程序:計算π的近似值,π的計算公式為
  • copyright 2024編程學習大全網