以下信号集相关的函数都是对自定义的信号集进行操作。
int sigemptyset(sigset_t *set);
- 功能:清空信号集中的数据,将信号集中的所有的标志位置为0
- 参数:set,传出参数,需要操作的信号集
- 返回值:成功返回0, 失败返回-1
int sigfillset(sigset_t *set);
- 功能:将信号集中的所有的标志位置为1
- 参数:set,传出参数,需要操作的信号集
- 返回值:成功返回0, 失败返回-1
int sigaddset(sigset_t *set, int signum);
- 功能:设置信号集中的某一个信号对应的标志位为1,表示阻塞这个信号
- 参数:
- set:传出参数,需要操作的信号集
- signum:需要设置阻塞的那个信号
- 返回值:成功返回0, 失败返回-1
int sigdelset(sigset_t *set, int signum);
- 功能:设置信号集中的某一个信号对应的标志位为0,表示不阻塞这个信号
- 参数:
- set:传出参数,需要操作的信号集
- signum:需要设置不阻塞的那个信号
- 返回值:成功返回0, 失败返回-1
int sigismember(const sigset_t *set, int signum);
- 功能:判断某个信号是否阻塞
- 参数:
- set:需要操作的信号集
- signum:需要判断的那个信号
- 返回值:
1 : signum被阻塞
0 : signum不阻塞
-1 : 失败
*/
#include <stdio.h>
#include <signal.h>
int main(){
sigset_t set;
sigemptyset(&set);
int ret = sigismember(&set, SIGINT);
if(ret == 0){
printf("SIGINT 不阻塞\n");
}else if(ret == 1){
printf("SIGINT 阻塞\n");
}
sigaddset(&set, SIGINT);
sigaddset(&set, SIGQUIT);
ret = sigismember(&set, SIGINT);
if(ret == 0){
printf("SIGINT 不阻塞\n");
}else if(ret == 1){
printf("SIGINT 阻塞\n");
}
ret = sigismember(&set, SIGQUIT);
if(ret == 0){
printf("SIGQUIT 不阻塞\n");
}else if(ret == 1){
printf("SIGQUIT 阻塞\n");
}
sigdelset(&set, SIGQUIT);
ret = sigismember(&set, SIGQUIT);
if(ret == 0){
printf("SIGQUIT 不阻塞\n");
}else if(ret == 1){
printf("SIGQUIT 阻塞\n");
}
return 0;
}
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
- 功能:将自定义信号集中的数据设置到内核中(设置阻塞,解除阻塞,替换)
- 参数:
- how : 如何对内核阻塞信号集进行处理
SIG_BLOCK: 将用户设置的阻塞信号集添加到内核中,内核中原来的数据不变
假设内核中默认的阻塞信号集是mask, mask | set
SIG_UNBLOCK: 根据用户设置的数据,对内核中的数据进行解除阻塞
mask &= ~set
SIG_SETMASK:覆盖内核中原来的值
- set :已经初始化好的用户自定义的信号集
- oldset : 保存设置之前的内核中的阻塞信号集的状态,可以是 NULL
- 返回值:
成功:0
失败:-1
设置错误号:EFAULT、EINVAL
int sigpending(sigset_t *set);
- 功能:获取内核中的未决信号集
- 参数:set,传出参数,保存的是内核中的未决信号集中的信息。
*/
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
int num = 0;
sigset_t set;
sigemptyset(&set);
sigaddset(&set,SIGINT);
sigaddset(&set,SIGQUIT);
sigprocmask(SIG_BLOCK, &set, NULL);
while (1)
{
num++;
sigset_t pendingset;
sigemptyset(&pendingset);
sigpending(&pendingset);
for(int i = 1; i <= 32; i++){
if(sigismember(&pendingset, i) == 1){
printf("1");
}else if(sigismember(&pendingset, i) == 0){
printf("0");
}else{
perror("sigismember");
exit(0);
}
}
printf("\n");
sleep(1);
if(num == 10){
sigprocmask(SIG_UNBLOCK, &set, NULL);
}
}
return 0;
}