信号

程序虚拟内存的3-4G是内核空间。
里面有PCB进程控制块 ,PCB里面维护两个集合,未决信号机和屏蔽信号集。
一旦有信号触发,未决信号集对应位被置1,信号处理完之后,对应位复原为0.
屏蔽信号集对应位置1表示这个信号被屏蔽。
kill -l查看系统所有信号,信号种类很多,0-31号信号需掌握。这些都是信号的红宏。其实就是int。代表信号编号。
信号
信号集操作:信号集为sigset_t类型其实就是一个unsigned long 类型,占8个字节。
屏蔽信号集:每个位对应一个信号是否被屏蔽,为1代表此信号被屏蔽。
未决信号集:
每个位对应这种信号是否未决。1代表未决。0代表没有产生这个信号或已经被处理。
1、设置屏蔽信号集。
首先自己设置好sigset_t对象,再把他赋值给屏蔽信号集。
sigemptyset(sigset *);//位全部置0
sigfillset(sigset_t *);//位全部置1
sigaddset(sigset_t * ,int 信号编号);对应位置1
sigdelset(sigset_t *,int 信号编号);对应位置0
int sigismember(sigset_t *,int信号编号);查看信号集对应位是1还是0;
设置好sigset_t对象之后,使用sigprocmask将sigset_t与屏蔽信号集进行或操作(设置对应位的阻塞)。进行与操作(接触对位的阻塞)。进行赋值。
sigprocmask(int 操作类型,sigset_t *,sigset_t *oldset(传出参数,传出设置之前的信号集))。
操作类型:
SIG_BLOCK:对应位设置屏蔽,或操作
SIG_UNBLOCK:对应位接触屏蔽,异或操作
SIG_SETMASK:直接将sigset_t对屏蔽信号集进行赋值;
2、查看未决信号集
sigpending(sigset_t *传出参数);
3、信号处理
信号处理分为:
默认处理,丢弃,信号捕捉
使用signal(int 信号编号,回调函数名)