我想知道为什么这两个信号在一个进程中不能被捕获、阻塞或忽略? 可以使用 signal() 更改剩余信号的操作。 这两个信号和剩余信号有什么区别?
最佳答案
如果你谈论他们为什么被阻止那么@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;
显然,该系统比我们想象的要复杂得多,但这只是一瞥,表明只允许 KERNEL 处理这些信号。不是我们。除此之外,函数的实现没有什么神奇之处。
@R Sahu也谈到了这个很重要的一个方面。还应限制 root 用户执行某些可能对系统有害的操作。 此外,一些无响应或错误的应用程序可能会在您别无选择或无法杀死它时终止。请谨慎使用 SIGKILL 或 SIGSTOP ..因为大多数时候它们不能很好地处理内存清理和其他内务处理工作。 ..仅当您没有其他选择时才使用这两个..SIGTERM 在这里更受欢迎
关于c - SIGKILL 和 SIGSTOP 信号不能被捕获、阻塞或忽略,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35569659/