sigprocmask函数
回记一下之前说的信号掩码,它是一组被进程阻塞的信号。进程可以检查它的信号掩码、改变它的信号掩码或通过一个操作同时做这两种操作——使用下面的函数:
|
首先、如果oset是一个非空指针,当前进程的信号掩码通过oset返回。
其次,如果set是一个非空指针,how指示了如何修改当前信号掩码。Figure 10.13描述了how可能使用的值。
|
SIG_BLOCK是逻辑或操作(逻辑加法),SIG_SETMASK是设置一个值。注意:SIGKILL和SIGSTOP不能被阻塞。
如果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; } |