GNU Linux(Arch Linux)上的SIGINFO丢失


12

我正在开发一个应用程序,我希望它可以根据需要将一些运行时统计信息打印到控制台。kill我立刻想到了信号。

阅读Wiki上的Unix信号SIGINFO似乎是一种可行的方法,因为:

  • 旨在为这些目的
  • 如果未实现信号处理程序,则不终止进程(与SIGUSRx- 相反,请参见此处

但是,通过检查的输出kill -l,看来我的服务器没有实现此信号。

我的问题是:

  1. 为什么SIGINFO我的系统不见了?所有GNU Linux系统上都不存在吗?
  2. 是否有一种简单的方法(即没有内核/ glibc重新编译)来启用此信号?如果没有,那么困难的方法是什么?
  3. 我可以为目标使用什么替代信号,如果目标过程未处理,则不会产生任何副作用?(由于我在glibc的手册上找不到任何其他合适的信号,因此我已经假设没有)

Linux metainfo:

Linux whatever 3.18.2-2-ARCH #1 SMP PREEMPT Fri Jan 9 07:37:51 CET 2015 x86_64 GNU/Linux

更新:我仍在寻找有关为何有条件将此信号从BSD以外的其他系统中排除的更多信息(请参阅下面的评论)。该信号似乎对许多目的都非常有用,因此我很难相信这只是个一时兴起的事情-那么该信号在Linux上的真正表现是什么呢?


2
是否^T出现在输出中stty -a
Mark Plotnick

嗯,事实并非如此-我一定误以为ddMac上所描述的行为是错误的。^Tdd执行期间,Linux机器上没有任何作用-我将相应地更新问题。
罗伯特·罗斯曼

是的,Ctrl-T和SIGINFO是BSD(和MacOSX)功能。
Mark Plotnick

但是信号是在Linux系统使用的GNU C库中定义的。然后故意禁用了该信号吗?
罗伯特·罗斯曼

1
@RobertRossmann,信号由内核传递。问题是Linux内核为什么不实现它(可能是因为他们复制了SysV信号)。
安赫尔

Answers:


4

有传言(回溯到Linux 0.x-1.x天)(因为它在BSD系统上很有用),但是如果我没记错的话,有理由在Linux上比BSD难做。

请注意,您要问的只是该功能的一小部分(即,您所谈论的stty info是control-T的一个条目,该条目使内核传递SIGINFOtty的进程组)-这部分很“简单”-但是当内核处理信号时让内核报告有关进程状态的信息(因为当时很少有人对此提供任何支持,所以该功能主要是关于“该进程在旋转还是挂起”和“什么进程在无论如何,它都更难”)-ISTR甚至存在有关正确显示该信息以及是否应将其与安全注意密钥路径相关联的安全/信任问题。也就是说,“简单”版本中可能仅发送信号的某些值...

(从个人记忆中;快速的网络搜索并没有发现任何明显的东西,但我认为必须深入到非常古老的档案中才能找到讨论的对象。)


1

关于您的问题1):

man 7 signal一个Arch Linux的系统上:

SIGINFO 29,-,- SIGPWR的同义词

(信号29 在alpha上为SIGINFO / SIGPWR,在sparc上为SIGLOST。)

通常,缺省情况下,在出现它的那些其他UNIX系统上,SIGPWR(在POSIX.1-2001中未指定)通常被忽略。

根据此定义,SIGINFO仅在alpha或sparc体系结构上可用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.