查看进程当前信号屏蔽字的最直接方式是调用sigprocmask(sig_setmask, null, &oldmask),其中oset参数非空且需预先初始化,可配合sigismember检查特定信号是否被阻塞。

要查看进程当前的信号屏蔽字,核心方法是调用 sigprocmask 函数并传入空的 set 参数、非空的 oset 参数,让内核把当前屏蔽字“读出来”存到你提供的变量里。
使用 sigprocmask 读取当前屏蔽字
这是最直接、标准的方式。关键点在于:
-
how参数可任意(如SIG_SETMASK),但因set为NULL,实际不修改屏蔽字 -
oset必须是非空指针,用于接收当前屏蔽字 - 调用前需先用
sigemptyset或sigfillset初始化oset所指向的sigset_t变量
代码示例(C语言)
以下片段能安全获取并打印当前屏蔽字中是否阻塞了 SIGINT(2号)和 SIGUSR1(10号):
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
sigset_t oldmask;
sigemptyset(&oldmask);
if (sigprocmask(SIG_SETMASK, NULL, &oldmask) == 0) {
if (sigismember(&oldmask, SIGINT)) {
printf("SIGINT is currently blocked\n");
}
if (sigismember(&oldmask, SIGUSR1)) {
printf("SIGUSR1 is currently blocked\n");
}
}
配合 sigpending 查看未决信号(辅助验证)
仅看屏蔽字还不够——你可能还想知道哪些被屏蔽的信号已经“卡在半路”(即已产生但未递达)。这时可调用:
-
sigpending(&set):把当前未决信号集填入set - 再用
sigismember检查具体信号是否在 pending 状态 - 注意:pending 和 block 是两个独立位图;一个信号只有“既 pending 又 blocked”,才会一直挂起不处理
用户态无命令行直接查看,需依赖调试或自编程序
Linux 没有像 ps 或 /proc/<pid>/status</pid> 那样暴露信号屏蔽字的现成命令。/proc 文件系统中也不提供该字段。所以:
- 若进程是你自己写的,就在关键位置插入上述
sigprocmask(..., NULL, &oldmask)逻辑 - 若想查看第三方进程,只能通过
gdb附加后调用系统函数(需有权限且进程未被加固) - 某些高级调试工具(如
strace -e trace=rt_sigprocmask)可捕获屏蔽字变更过程,但无法快照当前值










