信号如何不可跟踪(例如sigkill)?linux的引擎盖下发生了什么?

信号如何不可跟踪(例如sigkill)?linux的引擎盖下发生了什么?,linux,process,signals,Linux,Process,Signals,我知道有可捕捉和不可捕捉的信号。然而,这两种类型的信号似乎都是由操作系统发送到进程的。什么使不可捕捉的信号不可捕捉?是否是信号处理程序捕获信号,并且由于没有编写任何信号处理程序来处理特定信号(例如sigkill),因此它变得不可跟踪?如果这是真的,我能得出结论,通过编写信号处理程序来捕获不可跟踪的信号是可能的吗 不,您无法捕获不可跟踪的信号,因为它总是由内核实现的默认处理程序捕获。 SIGKILL始终终止进程。即使进程试图通过为其注册处理程序来处理SIGKILL信号,控件仍将始终位于将终止程序的

我知道有可捕捉和不可捕捉的信号。然而,这两种类型的信号似乎都是由操作系统发送到进程的。什么使不可捕捉的信号不可捕捉?是否是信号处理程序捕获信号,并且由于没有编写任何信号处理程序来处理特定信号(例如sigkill),因此它变得不可跟踪?如果这是真的,我能得出结论,通过编写信号处理程序来捕获不可跟踪的信号是可能的吗

不,您无法捕获不可跟踪的信号,因为它总是由内核实现的默认处理程序捕获。 SIGKILL始终终止进程。即使进程试图通过为其注册处理程序来处理SIGKILL信号,控件仍将始终位于将终止程序的defaultSIGKILL处理程序中。 这就是当您试图关闭系统时发生的情况。
首先,系统向所有进程发送一个SIGTERM信号,并等待一段时间,同时给这些进程一个宽限期。如果在宽限期之后仍然没有停止,系统将使用SIGKILL信号强制终止所有进程。

当信号队列非空时,将未屏蔽信号传递给进程定义的信号处理程序只是内核代码可以采取的可能操作之一。是否有可能用外行的话简化您的答案?信号不仅仅自动运行信号处理程序。内核代码从表中查找信号处理程序函数,保存线程上下文,创建一个新上下文,其中(信号信息位于寄存器或信号堆栈中,指令指针指向信号处理程序的开头,堆栈指针指向信号堆栈)然后上下文切换到该线程,使信号处理程序运行。但是内核可以选择不运行“启动信号处理程序”逻辑,而是执行其他操作。就像在内核进程列表中标记收件人进程已挂起(
SIGSTOP
),或者(
SIGKILL
)将其杀死并开始通知驱动程序fds已关闭。您可以将信号处理程序放在信号处理程序表中,但如果内核从未从该表条目中读取数据,则您将无法处理任何内容。如果您的意思是信号处理程序在用户空间中运行,则我会回答“否”。内核将捕获信号并在发现进程被终止之前终止进程。