c - SIGKILL 和 SIGSTOP 信号不能被捕获、阻塞或忽略,为什么?

标签 c

我想知道为什么这两个信号在一个进程中不能被捕获、阻塞或忽略? 可以使用 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/

相关文章:

c++ - 如何设置、清除和切换单个位?

c++ - 当一个套接字在后台执行操作时如何处理两个套接字

c - 从c中的文件中读取名称和密码

c# - 需要 CRC 编程帮助,从 .NET 类到 C 的 CRC32 转换

创建同名的共享内存段 - 返回错误?

c - 使用linux套接字通信(通过wifi)时,Socket-CAN不起作用

c - 具有多个 Pthread 的 MPI

c - 如何正确初始化和分配复合结构?

Java/C : OpenJDK native tanh() implementation wrong?

c - 为什么这个程序会在执行时崩溃?