我想知道为什么这两个信号在一个进程中不能被捕获、阻止或忽略?
可以使用 signal() 更改其余信号的操作。
这两个信号和其余信号有什么区别?
如果您谈论它们被阻止的原因,那么原因已经提到了@Adam B https://stackoverflow.com/users/1580216/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 https://stackoverflow.com/users/434551/r-sahu还谈到了这其中一个非常重要的方面。还应限制 root 用户执行某些可能对系统有害的操作。
此外,当您没有选择或选项来终止某些无响应或错误的应用程序时,它可能会被终止。谨慎使用 SIGKILL 或 SIGSTOP...因为大多数时候它们不能很好地处理内存清理和其他内务处理...仅当您没有其他选择时才使用这两个...SIGTERM 在这里更受欢迎
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)