信號之sigprocmask函數


一個進程的信號屏蔽字規定了當前阻塞而不能遞送給該進程的信號集調用函數sigprocmask可以檢測或更改其信號屏蔽字,或者在一個步驟中同時執行這兩個操作。

#include <signal.h>
int sigprocmask( int how, const sigset_t *restrict set, sigset_t *restrict oset );
返回值:若成功則返回0,若出錯則返回-1

首先,若oset是非空指針,那么進程的當前信號屏蔽字通過oset返回。

其次,若set是一個非空指針,則參數how指示如何修改當前信號屏蔽字。

表10-4說明了how可選用的值。注意,不能阻塞SIGKILL和SIGSTOP信號

表10-4 用sigprocmask更改當前信號屏蔽字的方法

  how

  說明

  SIG_BLOCK   該進程新的信號屏蔽字是其當前信號屏蔽字和set指向信號集的並集。set包含了我們希望阻塞的附加信號
  SIG_UNBLOCK   該進程新的信號屏蔽字是其當前信號屏蔽字和set所指向信號集補集的交集。set包含了我希望解除阻塞的信號
  SIG_SETMASK   該進程新的信號屏蔽字將被set指向的信號集的值代替

 

如果set是空指針,則不改變該進程的信號屏蔽字,how的值也無意義

在調用sigprocmask后如果有任何未決的、不再阻塞的信號,則在sigprocmask返回前,至少會將其中一個信號遞送給該進程。

sigprocmask是僅為單線程的進程定義的。

程序清單10-10 為進程打印信號屏蔽字中信號的名稱

#include "apue.h"
#include <errno.h>

void 
pr_mask(const char *str)
{
    sigset_t    sigset;
    int        errno_save;
    
    errno_save = errno;    /* we can be called by signal handlers */
    if (sigprocmask(0, NULL, &sigset) < 0)
        err_sys("sigprocmask error");

    printf("%s", str);
    
    if (sigismember(&sigset, SIGINT))    printf("SIGINT ");
    if (sigismember(&sigset, SIGQUIT))    printf("SIGQUIT ");
    if (sigismember(&sigset, SIGUSR1))    printf("SIGUSR1 ");
    if (sigismember(&sigset, SIGALRM))    pritnf("SIGALRM ");

    /* remaining signals can go here */

    printf("\n");
    errno = errno_save;
}

 

本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關於本書可參考:http://www.apuebook.com/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM