作者:手机用户2502892543 | 来源:互联网 | 2017-06-22 07:22
1. 信号掩码——被阻塞的信号集
每个进程都有一个用来描述哪些信号传送来将被阻塞的信号集,如果某种信号在某个进程的阻塞信号集中,则传送到该进程的此种信号将会被阻塞。当前被进程阻塞的信号集也叫信号掩码,类型为sigset_t。每个进程都有自己的信号掩码,且创建子进程时,子进程会继承父进程的信号掩码。
2. 信号阻塞和忽略的区别
阻塞的概念与忽略信号是不同的:操作系统在信号被进程解除阻塞之前不会将信号传递出去,被阻塞的信号也不会影响进程的行为,信号只是暂时被阻止传递;当进程忽略一个信号时,信号会被传递出去,但进程将信号丢弃。
3. 信号集的操作
信号集可以由以下几个函数操作:
int sigemptyset(sigset_t *set); //清空信号集
int sigfillset(sigset_t *set); //将所有信号填充进set中
int sigaddset(sigset_t *set, int signum); //往set中添加信号signum
int sigdelset(sigset_t *set, int signum); //从set中移除信号signum
int sigismember(const sigset_t *set, int signum); //判断signnum是不是包含在set中,在返回1,不在返回0
初始化往往可以用sigemptyset()将信号集清空,再用sigaddset()向信号集中添加信号;或者可以使用sigfillset()将所有信号添加到信号集,再用sigdelset()将某信号从中删除掉。
4. sigprocmask()介绍
可以使用函数sigprocmask()来检查或者修改进程的信号掩码。函数信息如下:
#include
int sigprocmask ( int how, const sigset_t *restrict set,
sigset_t *restrict old );
参数how 是一个整数,说明信号掩码的修改方式:
SIG_BLOCK --- 将set指向的信号集中的信号添加到当前阻塞信号集中;
SIG_UNBLOCK --- 从当前阻塞信号集中移除set指向的信号集中的信号;
SIG_SETMASK --- 指定set所指向的信号集为当前阻塞信号集。
此外,如果参数set 为NULL, 说明不需要修改,如果old 为NULL,sigprocmask会将修改之前的信号集放在*old 之中返回。
5.sigaction()回顾
在前面有用过sigaction()函数:
include
int sigaction(int signum,const struct sigaction *act,
const struct sigaction *oldact);
该函数是用于注册一个信号处理函数。参数结构体sigaction与函数同名,具体信息如下:
struct sigaction {
void (*sa_handler)(int); //老类型的信号处理函数指针
void (*sa_sigaction)(int, siginfo_t *, void *);//新类型的信号处理函数指针
sigset_t sa_mask; //将要被阻塞的信号集合
int sa_flags; //信号处理方式掩码
void (*sa_restorer)(void); //保留
}
[1] [2] 下一页