我正在开发一个应用程序,我希望它能够根据需要将一些运行时统计信息打印到控制台。kill
我立刻想到了信号。
通读Unix信号在 Wiki 上,SIGINFO
似乎是可行的方法,因为:
- 这是故意的为了这些目的
- 如果未实现信号处理程序,则不会终止进程(与
SIGUSRx
- 参见这里)
但是,通过检查 的输出kill -l
,我的服务器似乎没有实现此信号。
我的问题是:
- 为什么
SIGINFO
我的系统上缺失了?所有 GNU Linux 系统上都没有它吗? - 有没有一种简单的(即无需内核/glibc 重新编译)方法来启用此信号?如果没有,那么困难的路是什么?
- 我可以使用什么替代信号来达到我的目的不会引起任何副作用如果不由目标进程处理? (我已经假设没有,因为我找不到任何其他合适的信号glibc的手册)
Linux 元信息:
Linux whatever 3.18.2-2-ARCH #1 SMP PREEMPT Fri Jan 9 07:37:51 CET 2015 x86_64 GNU/Linux
更新:我仍在寻找更多信息来了解为什么此信号被有条件地从 BSD 以外的其他系统中排除(请参阅下面的评论)。这个信号似乎对很多用途都非常有用,所以我很难相信这只是一个心血来潮的问题——那么这个信号在 Linux 上可用的真正的亮点是什么?
答案1
有人讨论(早在 linux 0.x-1.x 时代)就添加了这个(因为它在 BSD 系统上很有用),但如果我没记错的话,当时在 Linux 上做正确的事情比在 BSD 上更难是有原因的。
请注意,您所询问的只是该功能的一小部分(即,您正在谈论stty info
control-T 的一个条目,导致内核将其交付SIGINFO
给 的tty
进程组) - 该部分很“简单” -但让内核报告有关进程状态的信息不处理信号(因为当时很少有东西对此有任何支持,该功能主要是关于“这个进程是旋转还是挂起”和“它到底是什么进程”)更难 - ISTR 甚至存在安全/信任问题关于准确显示该信息,以及是否应将其与安全注意密钥路径关联。也就是说,仅发送信号的“简单”版本可能有一些价值......
(根据个人记忆;快速的网络搜索并没有发现任何明显的东西,但我认为人们必须深入研究真的旧档案可以找到讨论。)
答案2
关于你的问题1):
在man 7 signal
Arch Linux 系统上:
信号信息 29,-,- 的同义词SIGPWR
……
(信号 29 是信号信息/SIGPWR在阿尔法但是信号丢失在 sparc 上。)
……
SIGPWR (POSIX.1-2001 中未指定)在它出现的其他 UNIX 系统上通常默认被忽略。
根据此定义,SIGINFO
仅适用于 alpha 或 sparc 架构。
答案3
这是因为 Linux 不是 Unix,在这种情况下意味着它是低劣的。旧的 DEC 系统也有 control-t。据我所知,它非常有用。那甚至是在 Unix 出现之前;例如查找“TOPS-10 操作系统命令手册”。是的,control-t 在 Unix 系统上发送 SIGINFO,这显然继承了它。