30天速通Linux 第六章信号及信号处理
学习资料https://pan.baidu.com/s/1NZpC4NyH0OHGOPPbO9J10g?pwdh9m2 提取码: h9m2一. 信号的基本概念信号是 Linux 进程之间的一种通信机制本质是软中断。read/write等系统调用都可能被信号中断。每个信号用SIGxxx整型宏表示定义在signal.hkill -l看列表man 7 signal看说明。使用信号的目的① 让进程知道发生了某事件② 执行自己代码中的信号处理程序。信号的 3 个来源用户按键CtrlC、Ctrl\进程执行出错除 0、非法访问其他进程用kill、sigqueue发送。信号的 3 种状态状态含义递送 delivery进程对信号采取动作执行处理函数或忽略未决 pending产生到递送之间阻塞 block进程指定阻塞该信号保持未决直到解除阻塞若处理方式是忽略信号永远不会递送/未决直接丢弃。二. 信号的分类分类可靠信号不可靠信号取值SIGRTMIN~SIGRTMAX小于SIGRTMIN行为来不及处理时排队不丢失来不及处理则丢弃只留一个Linux 共 64 种信号前 32 种非实时不支持排队 不可靠后 32 种实时支持排队 可靠。按来源还分同步信号进程自身操作产生如被零除异步信号进程外事件如击键。常用信号man 7 signal完整列表信号说明默认处理SIGINTCtrlC终止SIGQUITCtrl\终止 coreSIGKILL不可捕捉、不可忽略终止SIGSTOP不可捕捉、不可忽略暂停SIGSEGV内存非法访问终止 coreSIGPIPE往已关闭的管道/socket 写终止SIGCHLD子进程停止或终止忽略SIGALRMalarm/setitimer定时到期终止SIGUSR1/2用户自定义终止SIGTSTPCtrlZ挂起暂停SIGCONT让暂停的进程继续继续/忽略三. 信号的处理3.1 三种处理方式方式说明默认处理多数导致进程终止忽略signal(SIGINT, SIG_IGN)SIGKILL/SIGSTOP不能被忽略捕捉处理注册处理函数最常用SIGKILL/SIGSTOP不能被捕捉3.2signal老机制有缺陷#includesignal.hresultsignal(intsignum,void(*action)(int));actionSIG_DFL默认SIG_IGN忽略函数名。成功返回之前的处理函数指针失败返回 -1。voidsigHandler(intsignum){printf(The sign no is:%d\n,signum);signal(SIGINT,sigHandler);// ⚠ 必须重新注册否则恢复默认}intmain(){signal(SIGINT,sigHandler);signal(SIGQUIT,SIG_IGN);// 忽略 ^\ while (1) sleep(1);}⚠signal的三个问题① 处理函数执行中又来同类信号多余丢失② 又来异类信号中断当前处理③ 阻塞系统调用如read被信号打断后如何继续。→用sigaction替代。3.3sigaction推荐intsigaction(intsignum,conststructsigaction*act,structsigaction*oldact);structsigaction{void(*sa_handler)(int);// 老式处理函数void(*sa_sigaction)(int,siginfo_t*,void*);// 带附加信息可获知信号产生原因sigset_tsa_mask;// 处理期间额外阻塞的信号集intsa_flags;// 行为选项};sa_flags作用SA_RESTART被信号打断的阻塞系统调用read/write/ioctl自动重启不设则返回 -1errnoEINTRSA_SIGINFO用sa_sigaction3 参数而不是sa_handlerSA_NODEFER处理时不阻塞新信号此时sa_mask失效SA_RESETHAND处理完自动撤消注册即signal的老行为信号集操作函数intsigemptyset(sigset_t*set);// 清空intsigfillset(sigset_t*set);// 填满所有信号intsigaddset(sigset_t*set,intsignum);// 添加intsigdelset(sigset_t*set,intsignum);// 移除intsigismember(constsigset_t*set,intsignum);// 是否包含sigprocmask全程阻塞与sa_mask的区别是它对所有场合生效intsigprocmask(inthow,constsigset_t*newset,sigset_t*oldset);how含义SIG_BLOCK把newset加入原阻塞集SIG_UNBLOCK从原阻塞集移除newsetSIG_SETMASK把阻塞集设为newset示例可靠信号排队、不可靠信号丢失sem_t信号集设SIGINT(不可靠)SIGRTMIN(可靠)→sigprocmask(SIG_BLOCK)屏蔽 → sigaction 注册SA_SIGINFO→sleep(60)期间用 kill-SIGRTMINpid发多次 →sigprocmask(SIG_SETMASK,oldmask)解除阻塞 结果6个实时信号全部被处理普通 SIGINT 只处理1次四. 信号发送函数前提发送进程的用户 ID 与接收进程相同或发送者是超级用户。函数原型作用killint kill(pid_t pid, int sig);向指定进程发信号raiseint raise(int sig);向自身发信号等价kill(getpid(), sig)sigqueueint sigqueue(pid_t pid, int sig, const union sigval value);发信号并可附带数据unionsigval{intsival_int;void*sival_ptr;};sigqueue的value只有在注册时sa_flags含SA_SIGINFO才会传给处理函数。五. 可重入函数可重入函数可被多个任务并发调用而不产生数据错误。信号处理函数中必须只用可重入函数。可重入函数中不用静态变量、不用malloc/free、不用标准 I/O 库用全局变量要小心。常见可重入函数readwriteopencloseforkexitkillraisesignalsigactionwaitwaitpidsleeplseekstatduppipesocketsendrecv等完整列表见man 7 signal的 Async-signal-safe functions。六. 父子进程的信号处理子进程继承父进程的信号处理方式直到调用exec。子进程exec后父进程中设为捕捉的信号恢复为默认处理其余不变。act.sa_sigactionintsig_handler;act.sa_flagsSA_SIGINFO;sigaction(SIGINT,act,NULL);printf(The parent pid %d\n,getpid());pidfork();// if (pid 0) execvp(ls, arg); // 打开后子进程 SIGINT 变回默认终止while(1);七. 信号处理的应用7.1 被中断的系统调用慢速设备终端、文件、网络、磁盘的系统调用会被信号中断用sigaction且设SA_RESTART时自动重启否则返回 -1 EINTR。7.2 用SIGCHLD防止僵尸进程子进程退出会向父进程发SIGCHLD默认被忽略在处理函数里wait/waitpid即可回收。voidsigchld_handler(intsig){intstatus;waitpid(-1,status,WNOHANG);if(WIFEXITED(status))printf(child process exit normally\n);elseif(WIFSTOPPED(status))printf(child process is stopped\n);}intmain(){pid_tpid;signal(SIGCHLD,sigchld_handler);pidfork();if(pid0)abort();// 子进程异常退出elseif(pid0){sleep(2);printf(parent process\n);}elseexit(0);}八. 系统定时信号8.1 睡眠函数unsignedintsleep(unsignedintseconds);// 秒voidusleep(unsignedlongusec);// 微秒unsignedintalarm(unsignedintseconds);// seconds 秒后产生 SIGALRMintpause(void);// 挂起直到收到一个信号才返回用alarmpause实现sleepvoidalarm_handler(inta){printf(sleep is over);}intmysleep(intseconds){signal(SIGALRM,alarm_handler);alarm(seconds);pause();}⚠sleep内部就是用alarm实现的不要和alarm混用。8.2 三个计时器计时器计算内容信号ITIMER_REAL真实程序运行的实际时间SIGALRMITIMER_VIRTUAL虚拟用户态消耗的时间SIGVTALRMITIMER_PROF实用用户态 内核态SIGPROF例用户态 10s 内核态 8s 睡眠 7s → 真实 25s、虚拟 10s、实用 18s。intgetitimer(intwhich,structitimerval*value);intsetitimer(intwhich,conststructitimerval*value,structitimerval*ovalue);structitimerval{structtimevalit_interval;// 重复间隔structtimevalit_value;// 初始倒计时};structtimeval{longtv_sec;longtv_usec;};// 秒 / 微秒signal(SIGALRM,alarmsign_handler);structitimervaltval;timeChange(1,tval.it_value);// 初始 1 毫秒timeChange(1000,tval.it_interval);// 每 1000 毫秒触发一次setitimer(ITIMER_REAL,tval,NULL);while(getchar()!#);// 输入 # 退出

相关新闻

Codex 下载与本地部署实战:从环境搭建到高效编程

Codex 下载与本地部署实战:从环境搭建到高效编程

Codex 下载与本地部署实战目录1. 引言2. 环境准备3. Codex 下载与安装4. 登录与基础配置5. 本地部署实战:对接本地大模型6. Codex 核心功能实战7. 完整实战案例:搭建一个本地技术文章生成工具8. 常见问题与排错9. 总结与参考资料1. 引言 什么是 Codex&a…

2026/10/11 8:41:18 阅读更多 →
工业胶袋厂家有没有黑名单,哪些供应商容易踩坑

工业胶袋厂家有没有黑名单,哪些供应商容易踩坑

摘要:国内工业胶袋行业没有全国统一官方黑名单,市场监管部门仅会公示抽检不合格企业名单,不存在行业统一的黑名单数据库。采购风险主要集中在 5 类高风险供应商:皮包中间商、低价偷料型、资质造假套牌、样品与大货双标、交付失控的…

2026/10/11 21:56:50 阅读更多 →
实测几类高频 AI 小工具:文案降AI味、去水印、周报生成,怎么选不踩坑

实测几类高频 AI 小工具:文案降AI味、去水印、周报生成,怎么选不踩坑

AI 工具现在的问题不是「不够多」,而是「太多」。真到干活的时候,收藏夹里躺着一堆网站,反而不知道该点开哪个。 这篇不堆清单,只讲我日常真会用的几类小工具,以及踩过的坑。按「一个具体活儿」来找工具,比…

2026/10/11 0:35:42 阅读更多 →

最新新闻

PLC程序质量四层评估模型:从能运行到可维护可演进

PLC程序质量四层评估模型:从能运行到可维护可演进

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 2:54:40 阅读更多 →
2026年8个AI论文写作工具实测:TaoToken统一Key接入GPT与Gemini的配置清单

2026年8个AI论文写作工具实测:TaoToken统一Key接入GPT与Gemini的配置清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 2:54:40 阅读更多 →
TAB Cursor 从 GitHub Copilot 迁移到 TaoToken:统一 Key 与 Base URL 配置指南

TAB Cursor 从 GitHub Copilot 迁移到 TaoToken:统一 Key 与 Base URL 配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 2:54:39 阅读更多 →
Ubuntu Secure Boot下r8168网卡驱动签名实战指南

Ubuntu Secure Boot下r8168网卡驱动签名实战指南

1. 问题本质与真实场景还原你刚装好Ubuntu系统,网线一插,桌面右上角网络图标显示“有线已连接”,但浏览器打不开任何网页,终端里ping 8.8.8.8直接超时——连基础连通性都没有。更诡异的是,执行sudo dmesg | tail -20&a…

2026/10/12 2:54:39 阅读更多 →
开源SMU源表USMU深度拆解:从电路设计到校准实战

开源SMU源表USMU深度拆解:从电路设计到校准实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 2:54:39 阅读更多 →
嵌入式Linux安卓驱动开发:供需、实战与面试全攻略

嵌入式Linux安卓驱动开发:供需、实战与面试全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 2:53:39 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →