当前位置: 首页
系统平台
Linux进程信号处理方法查看指南

Linux进程信号处理方法查看指南

热心网友 时间:2026-07-01
转载

信号的机制在 Linux 进程管理中看似简单,实则容易引发隐蔽问题。许多开发者虽已习惯使用kill发送信号,但要真正诊断“进程究竟有没有收到信号”“它以何种方式处理了信号”,就必须借助多种工具综合判断,才能拼出完整的信号流转图谱。

通过 ps 命令可快速查看进程的当前信号注册状态,包括 sigcatch(已捕获)与 sigign(已忽略)等字段;而 /proc/PID/status 文件则提供了 SigPnd(挂起信号)、SigBlk(阻塞信号)、SigCgt(已捕获信号)等十六进制位图;配合 strace -e signal 能在运行时实时观测信号是否实际递达目标进程。

Linux怎么查看进程的各种信号处理

通过 ps 命令查看进程当前信号处理状态

ps 提供了快捷入口,能直接展示进程对哪些信号设置了忽略、捕获或未作处理(即走默认行为)。但需要注意,该命令仅反映当前已注册的 handler 状态,无法体现信号是否被屏蔽或处于挂起状态。

  • 执行 ps -p -o pid,comm,sig,sigcatch,sigign:其中 sig 表示被阻塞(blocked)的信号位图,以十进制形式呈现;sigcatch 列出已注册 handler 的信号编号(如 2,10,12);sigign 则列出被明确忽略的信号(如 17,19
  • 这里容易混淆的是:sig 字段是阻塞掩码,而非 pending 信号。它与 /proc//status 中的 SigBlk 对应,只是格式略有差异——ps 使用十进制位图,而 /proc 使用十六进制表示
  • 如果一个信号既不在 sigcatch 也不在 sigign 中,则说明该信号采用默认动作。例如 SIGTERM 的默认行为就是终止进程

借助 /proc//status 查看信号位图细节

若论数据权威性,/proc//status 无疑最可靠。内核在此提供了最原始的信号状态信息,只不过需要手动解析位图数值。

  • 运行 cat /proc//status | grep -E "SigPnd|SigBlk|SigCgt"
  • SigPnd:挂起(pending)信号位图,表示已发送但尚未递达的信号——例如因被阻塞而搁置的信号
  • SigBlk:当前被屏蔽(blocked)信号的位图,对应 sigprocmask() 的配置结果
  • SigCgt:已注册 handler 的信号位图,即通过 signal()sigaction() 显式设置过的信号
  • 这些字段均为 64 位十六进制数(例如 0000000000000000),低位对应信号 1(SIGHUP),高位对应信号 64;普通信号仅使用低 32 位,解析时需留意这一点

通过 strace -e signal 实时观察信号递达行为

前述工具均聚焦于“静态配置”,但信号是否真正递达,必须依靠 strace 现场抓取。对于调试 handler 是否生效、是否被屏蔽拦截,这几乎是唯一可靠的手段。

  • 执行 strace -p -e trace=signal,进程一旦收到信号就会输出类似 --- SIGUSR1 {si_signo=SIGUSR1, si_code=SI_USER, si_pid=12345, si_uid=1000} --- 的信息
  • 若全程无任何输出,说明信号根本未能递达——要么被屏蔽(SigBlk 对应位置为 1),要么 PID 发送错误,或者权限不足
  • 添加 -f 可跟踪子进程;使用 strace -e signal=SIGUSR1 能只过滤特定信号,避免日志刷屏
  • 需要提醒的是:strace 本身会干预信号传递路径(例如某些信号可能被其截获),因此仅适合诊断场景,不宜在生产环境长期启用

利用 kill -lman 7 signal 查询信号编号与默认动作

还有一个容易被忽略的细节:信号编号及其默认动作,许多人仅凭印象记忆,而实际问题往往就源于此处认知偏差。

  • kill -l 输出信号名称与编号的映射关系。注意:SIGUSR1 对应编号 10,而非 1;SIGRTMIN 开始才是实时信号(编号 34 以上)
  • man 7 signal 清晰列出每个信号的默认动作,包括 Term(终止)、Ign(忽略)、Core(生成 core 文件)、Stop(暂停)等。例如 SIGCHLD 默认是 Ign,而 SIGPIPE 默认是 Term
  • 切勿依赖记忆。比如 SIGHUP 编号为 1,但某些老旧系统可能曾有过不同定义;始终以 kill -l 的输出为准
  • 若自定义 handler 后行为异常,请先查阅手册确认该信号是否允许被忽略——SIGKILLSIGSTOP 既无法捕获也不能忽略,这一要点常被开发者遗忘直至故障出现

由此可知,进程信号状态分散在多个数据源中:ps 负责查看注册状态,/proc 提供位图细节,strace 负责捕获实际递达。通过几个窗口对照分析,真相便能水落石出。最容易忽视的恰好是 SigPndSigBlk 的关联关系:若一个信号同时出现在 SigPndSigBlk 中(对应位置均为 1),则说明它被阻塞而无法递达,陷入永久挂起状态。这才是排查时需要特别留意的关键点。

来源:https://www.php.cn/faq/2743839.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
麒麟系统字体太小看不清如何调整界面字体大小

麒麟系统字体太小看不清如何调整界面字体大小

麒麟系统高分屏字体过小需分层干预:控制中心调整缩放至150%或200%,辅助功能增大文本,命令行设置MateDPI值(2K设200 0,4K设220 0),QT类软件用环境变量QT_DEVICE_PIXEL_RATIO=2,终端取消使用系统等宽字体并改字号,输入法候选字体调至16或18。

时间:2026-07-01 07:42
Win11记事本默认不换行如何设置为自动换行

Win11记事本默认不换行如何设置为自动换行

Windows11记事本默认不自动换行,手动开启仅对当前窗口有效。若要永久启用,可修改注册表,在HKCU Software Microsoft Notepad路径下新建DWORD值fWrap并设为1,或导入含此设置的 reg文件,此后所有新建记事本文件均自动换行显示,无需重复手动操作,一劳永逸。

时间:2026-07-01 07:42
银河麒麟系统时间快几分钟的调整方法

银河麒麟系统时间快几分钟的调整方法

银河麒麟系统时钟快几分钟的解决方法:先用date命令校正系统时间,再执行hwclock--systohc写入硬件时钟;启用systemd-timesyncd并配置阿里云NTP服务器;禁用chronyd避免服务冲突;双系统用户需设置硬件时钟为UTC模式。

时间:2026-07-01 07:41
Win11多屏下设置软件只在特定屏幕打开的方法

Win11多屏下设置软件只在特定屏幕打开的方法

双屏办公时,通过快捷方式添加启动参数、利用Windows窗口位置记忆功能或PowerShell脚本,可让软件自动在副屏打开,免去手动拖拽,提升工作效率。

时间:2026-07-01 07:41
MacBook如何取消菜单栏蓝牙搜索状态

MacBook如何取消菜单栏蓝牙搜索状态

在macOS中,进入系统设置“控制中心”,将蓝牙设为“不显示在菜单栏”即可隐藏图标且功能正常;旧版系统则在蓝牙偏好设置中取消勾选“在菜单栏中显示”。

时间:2026-07-01 07:41
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全