Linux 信号处理

Linux 信号处理,linux,unix,posix,sigkill,posix-api,Linux,Unix,Posix,Sigkill,Posix Api,如果linux进程正在等待I/O(即处于SLEEP状态),并且针对它发出了SIGKILL信号,在终止(STOPPED状态)时,它是否会通过RUNNING或READY状态 换言之,对于处理系统中断(例如由SIGKILL生成的中断)的进程,是否需要通过RUNNING或READY状态 知道在正常情况下一个进程可以处理来自内核的中断,并且知道SIGKILL有一个相当矛盾的目的,即杀死一个无响应的信号,我怀疑被杀死的进程有多少控制权,如果有的话。信号是由内核“传递”给进程的,因此,将信号从processA

如果linux进程正在等待I/O(即处于
SLEEP
状态),并且针对它发出了
SIGKILL
信号,在终止(
STOPPED
状态)时,它是否会通过
RUNNING
READY
状态

换言之,对于处理系统中断(例如由
SIGKILL
生成的中断)的进程,是否需要通过
RUNNING
READY
状态

知道在正常情况下一个进程可以处理来自内核的中断,并且知道
SIGKILL
有一个相当矛盾的目的,即杀死一个无响应的信号,我怀疑被杀死的进程有多少控制权,如果有的话。

信号是由内核“传递”给进程的,因此,将信号从processA发送到processB使用内核。当SIGKILL被交付时,内核不允许进程进行任何活动(用户模式),特别是进程运行:atexit调用,\u exit。没有什么。这个过程只是被系统破坏了。这涉及内核模式中的一些活动。缓冲数据丢失。SYSV信号量和其他内核持久内存对象留在内存中。它可能真的是一团糟

如果内核内存中的某些内容导致挂起,请在linux中使用sysrq接口:

--执行任何可能出现的有序关机

这就是为什么使用SIGKILL是绝对的最后手段,因为你不知道你在破坏什么。而且它不会修复所有的挂起


你到底在做什么

除了吉姆·麦克纳马拉的回答之外:

无法处理SIGKILL(kill-9)


更多信息,请参见上的答案。

我认为OP的问题不是针对
SIGKILL
。我把它理解为“一个进程是否需要激活才能处理一个信号”。一个进程必须有cpu上下文才能接收信号。SIGKILL略有不同。进程有两个组件——内核——有时称为P0,用户代码称为P1。当内核拾取SIGKILL时,P0和P1只返回到分页池非分页池和系统内存。信号量之类的东西会留在内核内存中。因此,从这个意义上说,P1永远不会变为活动状态。你肯定会争辩说某些P0活动是在流程上下文中,但你的用户模式代码对此无能为力。是的,我知道,你的帖子已经说,
SIGKILL
无法处理。但我不认为OP要求的是
SIGKILL
,而是所有信号。因此,您评论的第一句话是对OP的问题IMO的回答。仅内核的进程(例如僵尸)无法接收信号,因为它不会为它们轮询。所以,无论如何,没有什么可杀的。也许这就是困惑的根源。内核“部分”做东西,用户陆地部分不做“东西”@nemo-答案是进程必须能够轮询信号,这意味着它必须有进程上下文。它必须能够访问cpu。所有信号都是如此。
SIGKILL
是一个不幸的例子,因为它是一个接收过程无法处理的信号。如果你的问题与<代码> SigKys<代码>无关,它只是一个例子,考虑使用另一个信号来表达你的意思。