SIGKILL 和 SIGSTOP 信号无法被捕获、阻止或忽略,为什么?

sam*_*sam 12 c

我想知道为什么这两个信号在一个进程中不能被捕获、阻止或忽略?可以使用 signal() 更改其余信号的操作。这两个信号和其余信号有什么区别?

May*_*kar 6

如果你谈论为什么它们被阻止,那么@Adam B已经提到了原因。但是我想展示一些内部结构。并不是说你不能真正屏蔽这两个信号。只有KERNEL有能力做到这一点,我们没有。

在实现中signal.h,你可以看到有这样一行

#define SIG_KERNEL_ONLY_MASK (rt_sigmask(SIGKILL) | rt_sigmask(SIGSTOP))

这表明这两个信号只能被内核屏蔽

另一个宏包裹在它周围

#define sig_kernel_only(sig) (((sig) < SIGRTMIN) && siginmask(sig, SIG_KERNEL_ONLY_MASK))

后来在 signal.c 中使用。

当一个被调用的函数接收到任何具有负值的信号或任何除内核之外不需要处理的信号时,它do_sigaction就会返回。EINVAL

看看这个

if (!valid_signal(sig) || sig < 1 || (act && sig_kernel_only(sig)))
     return -EINVAL;
Run Code Online (Sandbox Code Playgroud)

显然,这个系统比我们想象的要复杂,但这只是一瞥,表明只有 KERNEL 可以处理这些信号。不是我们。除此之外,该函数的实现并没有什么神奇之处。

@R Sahu也谈到了其中一个非常重要的方面。还应限制 root 用户执行某些可能对系统有害的操作。此外,当您没有选择或选项来杀死它时,一些无响应或错误的应用程序可能会被终止。谨慎使用 SIGKILL 或 SIGSTOP ..因为大多数时候它们不能很好地处理内存清理和其他内务处理工作...使用仅当您没有其他选择时这两个..SIGTERM 在这里更受欢迎