【Linux复习】:进程信号
进程信号信号概念与本质信号是软件中断用来异步通知进程某个事件已发生。会打断进程当前执行流程让它转去处理信号。进程对每个信号都有默认处理方式忽略、捕获、终止、 core dump 等。内核在进程的 task_struct 里用 ** 信号位图pending 信号集** 标记 “有信号到达”信号种类非可靠信号1-31支持信号丢失多个相同信号同时发来可能只触发一次不排队只标记 “有 / 没有”可靠信号34-64支持排队发多少次就处理多少次不会丢失有优先级值越大优先级越高信号生命周期信号的产生本质操作系统给进程发送一个 “事件通知”硬件来源键盘CtrlC→SIGINT、Ctrl\→SIGQUIT硬件异常除零、非法内存访问 → OS 发 SIGFPE、SIGSEGV软件来源系统调用kill、raise、abort软件条件alarm 超时 → SIGALRM管道破裂 → SIGPIPE信号在进程中注册注册内核在进程的 task_struct 中为该信号绑定处理函数指针相当于handler[signo] 自定义函数注销把信号的处理方式恢复成默认或忽略并不是把信号删掉而是取消自定义捕捉信号的处理三种处理方式默认处理SIG_DFL终止、暂停、忽略、Core Dump 等忽略处理SIG_IGN直接丢掉不做任何事自定义捕捉typedefvoid(*sighandler_t)(int);自己写函数信号来时跳转执行修改处理方式的接口signalsignal(SIGINT,handler);signactionstructsigactionact;act.sa_handlerhandler;sigemptyset(act.sa_mask);sigaction(SIGINT,act,NULL);用户态 ↔ 内核态切换用户态受限只能访问自己资源内核态高权限可管理硬件、进程、信号信号处理流程用户态运行 → 收到信号 → 陷入内核 → 选择处理函数 → 切回用户态执行自定义函数 → 再回内核 → 恢复原执行流信号的保存信号递达信号准备被处理处理方式有默认忽略自定义信号未决信号传输成功但还未处理这个状态信号阻塞表示信号被阻塞信号不会被识别blocked 位图阻塞信号集pending 位图未决信号集handler:递达信号集信号的阻塞原理在内核的 blocked 信号位图中标记对应位为 1→ 该信号暂时不被处理一直停留在 pending实现接口sigprocmask(how,set,oldset);可设置阻塞、解阻塞、替换阻塞信号集函数可重入与不可重入函数可重入定义在多个执行流信号处理函数 / 线程中同时调用不会出现数据混乱、安全问题特点不访问全局变量、静态变量不使用malloc/free不调用不可重入函数只使用局部变量、函数参数信号安全信号处理函数中只能调用可重入函数不可重入函数访问全局 / 静态变量、使用 malloc、调用库函数多执行流同时调用 → 数据错乱、逻辑崩溃绝对不能在信号处理函数中使用volatile作用保持内存可见性告诉编译器不要优化这个变量每次都从内存读取不要用寄存器缓存防止过度优化避免编译器自作主张删除代码、缓存值导致程序逻辑错误使用场景信号处理函数中修改的全局变量多线程共享变量硬件寄存器访问信号的相关操作// 1. 信号集初始化intsigemptyset(sigset_t*set);// 清空信号集所有位0intsigfillset(sigset_t*set);// 填满信号集所有位1// 2. 信号集增删查intsigaddset(sigset_t*set,intsignum);// 添加一个信号intsigdelset(sigset_t*set,intsignum);// 删除一个信号intsigismember(constsigset_t*set,intsignum);// 判断信号是否在集合中// 3. 设置信号阻塞核心intsigprocmask(inthow,constsigset_t*restrict set,sigset_t*restrict oset);// howSIG_BLOCK(阻塞) / SIG_UNBLOCK(解阻塞) / SIG_SETMASK(覆盖)// 4. 获取未决信号intsigpending(sigset_t*set);// 读取当前pending信号集// 5. 修改信号处理方式现代、安全intsigaction(intsig,conststructsigaction*restrict act,structsigaction*restrict oact);// 6. 修改信号处理方式老式、简单void(*signal(intsig,void(*func)(int)))(int);核心转储定义程序崩溃时操作系统把进程内存数据保存到 core 文件用于调试崩溃原因特点存储崩溃时的内存、寄存器、调用栈作用快速定位崩溃代码gdb 调试默认关闭文件太大、占用磁盘
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2496790.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!