
信号未决信号普通信号连发好几次内核只记有过这个信号多发的直接忽略只留一条记录。阻塞、忽略、捕捉三个处理方式阻塞信号发过来了我先挡着不收信号暂时存起来忽略信号到眼前直接扔掉压根不存捕捉收到信号运行自己写的处理函数信号走完完整流程信号被发送产生 → 如果开了阻塞就存成未决信号 → 解除阻塞后递达处理内核存信号靠三样东西每个进程自带阻塞集合标记哪些信号要挡住未决集合标记哪些信号已经发来、还没处理普通信号只记有无不记来了多少次处理函数表存每个信号该怎么处理默认 / 忽略 / 自己写的函数普通信号和实时信号区别131 号是普通信号不排队短时间多发会丢信号34 往后是实时信号会排队发多少次存多少次不会丢6.信号处理时机阻塞信号的操作1.sigset_t 就是信号集合类型专门用来存一堆信号本质是一块二进制位图。每一个二进制位对应一个信号位为 1 选中这个信号0 没选中前面说的阻塞集 block、未决集 pending全都是 sigset_t 类型变量。定义阻塞哪些信号sigset_t block;拿进程当前未决信号sigset_t pending;sigkill,sigstop不能被忽略阻塞或者捕获2.sigpending:未决信号集3.信号处理函数的限制1.可重入性2.异步信号安全只有一小部分系统调用是“异步信号安全”可以在函数调用中安全调用信号捕捉1.信号递达内核时替换成自己的处理动作而不是执行默认动作2.如何实现main 函数用户态↓产生信号↓程序触发中断 / 系统调用进入内核↓内核查到该信号绑定了自定义 sighandler↓保存 main 运行现场↓跳转执行 sighandler 信号捕捉函数↓sighandler 执行完毕↓再次进入内核恢复现场.00↓回到 main 被打断处继续运行信号处理函数回调函数提前写好一个函数不自己主动调用它交给系统 / 内核保管等满足某个条件时系统自动跑去执行你的这个函数这个函数就叫回调函数。signal函数注册信号的处理方式告诉内核某个信号来了该怎么处理。2.sigaction函数需要handlermask处理时信号屏蔽flags选项标志关键机制自动屏蔽且额外屏蔽其他信号支持获取原处理动作而signal不行3.不可捕捉信号9号SIGKILL19号SIGSTOP4.可重入函数可以被多个控制流同时调用而不会产生数据错乱的函数特征调用malloc,free调用IO库函数使用返回静态/全局变量的地址*可重入只使用局部变量或调用者传入参数5.volatile:作用禁止编译器优化强制内存访问保证内存可见性防止指令重排序