sigprocmask函数

sigprocmask函数

回记一下之前说的信号掩码,它是一组被进程阻塞的信号。进程可以检查它的信号掩码、改变它的信号掩码或通过一个操作同时做这两种操作——使用下面的函数:

#include <signal.h>

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

Returns: 0 if OK, 1 on error

首先、如果oset是一个非空指针,当前进程的信号掩码通过oset返回。

其次,如果set是一个非空指针,how指示了如何修改当前信号掩码。Figure 10.13描述了how可能使用的值。

Figure 10.13. Ways to change current signal mask using sigprocmask

how

Description

SIG_BLOCK

进程的新信号掩码是由它当前的信号掩码和信号集(由set指向信号集)组成。就是,set包函了我们想额外阻塞的信号。

SIG_UNBLOCK

进程的新信号掩码是由当前信号掩码和信号集的补集相交获得(信号集的补集由set指向)。也就是set包含了我们想解锁的信号掩码。

SIG_SETMASK

进程的新信号掩码就是由set指定。

SIG_BLOCK是逻辑或操作(逻辑加法),SIG_SETMASK是设置一个值。注意:SIGKILLSIGSTOP不能被阻塞。

如果set是空指针,进程的信号掩码不会被修改,并且忽略how的设置。

在调用sigprocmask后,如果发生任何未阻塞的信号,在sigprocmask返回之前,这些信号之一会被传送到进程。

sigprocmask函数仅被定义在单线程的进程中。将在APUE的12.8节中讲述另一个用于多线程的函数版本。

例:

Figure 10.14 显示了一个程序,它打印了在当进程中信号掩码所包含的信号名。我们会在figure 10.20和figure 10.22中调用这个程序。

为了节省空间所以我们并没有测试每一个信号。

Figure 10.14. Print the signal mask for the process
#include <signal.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.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)
        printf("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))  printf("SIGALRM ");

    /* remaining signals can go here */

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

发表评论