【发布时间】:2010-11-09 14:37:44
【问题描述】:
内核中谁负责杀死一个进程。
如果“杀”来了,进程处于阻塞状态怎么办。 kill 是否等到进程进入运行状态才能清理自己。
如果有人可以在内核方面回答更多问题,例如从 kill 命令生成 SIGINT 时,内核会调用所有内容,直到最终清除 TCB(任务控制块)。
【问题讨论】:
标签: c linux operating-system kernel
内核中谁负责杀死一个进程。
如果“杀”来了,进程处于阻塞状态怎么办。 kill 是否等到进程进入运行状态才能清理自己。
如果有人可以在内核方面回答更多问题,例如从 kill 命令生成 SIGINT 时,内核会调用所有内容,直到最终清除 TCB(任务控制块)。
【问题讨论】:
标签: c linux operating-system kernel
运行 kill 只是向进程 (TERM) 发送一个信号,要求它很好地终止。如果它不回应那是它的业务。但是,您可以选择发送several different signals 中的任何一个命令它离开。您可能感兴趣的是 kill -9 (SIGKILL),它会在不给它选择的情况下杀死它。
(编辑:正如 cmets 中指出的,TERM 是默认值)
【讨论】:
kill 默认发送SIGTERM 是终止信号,而不是SIGINT
我假设您在谈论 SIGKILL,所以我将只讨论该信号。
当一个进程对另一个进程发出 SIGKILL 信号时,SIGKILL 会作为挂起信号添加到受害进程上,并且任何挂起的 SIGSTOP、SIGTSTP、SIGTTOU 或 SIGTTIN 信号都会被清除。如果受害者停止或处于可中断的睡眠状态,它就会被唤醒(使其可运行)。
当受害者进程下一次尝试从内核模式进入用户模式时,会检查挂起的信号。这是找到挂起的 SIGKILL 的地方,内核调用 do_exit() 而不是返回用户模式。
从内核模式到用户模式的转换将在下一次调度进程时进行(除非它处于不间断睡眠 - 这是臭名昭著的 D 状态)。如果它处于不可中断的睡眠状态,则进程在唤醒之前不会尝试返回用户模式。
【讨论】:
每个进程可以接收多种类型的信号,它可以忽略处理,但很少有没有传递给进程,但“进程调度程序”终止进程.... 看到这个以获得更多解释 http://www.linux-tutorial.info/modules.php?name=MContent&pageid=289
【讨论】:
使用 SIGKILL 以外的信号杀死它,只会导致发送信号。这可以被屏蔽或忽略,但假设它不是(或在它被取消屏蔽之后),那么它会中断程序的正常运行。
如果正在进行 IPC 类型的系统调用(例如,从套接字读取、select()、poll()、sleep() 等),那么它将被中断并在 errno 中显示 EINTR 失败。正确编写的应用程序将在处理信号后重新发出调用。
然后进程立即执行对信号处理程序的调用,该处理程序可能返回以允许处理继续,或者它可能调用 longjmp(在 C 中),或者它可能退出进程,这通常是默认设置。
SIGKILL 完全不同,以上都没有发生。相反,它只是退出系统调用(如果允许进程读取它,这可能会将 EINTR 留在 errno 中),然后导致任务立即退出而无法处理它。
但我认为它们中的任何一个都在等待“D”“不间断睡眠”状态完成。这通常是诸如阻塞磁盘读取、页面错误请求加载之类的东西。
【讨论】:
SIGSTOP 也不能被屏蔽或忽略。
EINTR 不会返回,除非您安装了中断信号处理程序,或者使用 sigaction 并省略了 SA_RESTART 标志,或者如果您的系统的 signal 函数默认中断(它没有打开健全的系统,如 Linux 和 BSD)。
杀死(而不是中断)通常由 UNIX 系统中的 SIGKILL 信号执行(CTRL-C 发送 SIGINT)。
这些系统通常提供一种通过信号中断阻塞系统调用的方法,该方法允许信号处理程序执行而无需等待系统调用完成(这就是 EINTR 错误发挥作用的地方)。所以通常,调用只是被取消,而不是等待它完成。
【讨论】: