【问题标题】:How does a "kill" work? And especically how does a "kill" work on blocked proces?“杀戮”如何运作?尤其是“杀戮”如何对受阻价格起作用?
【发布时间】:2010-11-09 14:37:44
【问题描述】:

内核中谁负责杀死一个进程。

如果“杀”来了,进程处于阻塞状态怎么办。 kill 是否等到进程进入运行状态才能清理自己。

如果有人可以在内核方面回答更多问题,例如从 kill 命令生成 SIGINT 时,内核会调用所有内容,直到最终清除 TCB(任务控制块)。

【问题讨论】:

    标签: c linux operating-system kernel


    【解决方案1】:

    运行 kill 只是向进程 (TERM) 发送一个信号,要求它很好地终止。如果它不回应那是它的业务。但是,您可以选择发送several different signals 中的任何一个命令它离开。您可能感兴趣的是 kill -9 (SIGKILL),它会在不给它选择的情况下杀死它。

    (编辑:正如 cmets 中指出的,TERM 是默认值)

    【讨论】:

    • 嗨 Joeslice,我问了更多关于内核的问题,谁将选择 SIGINT,以及当内核中的“ABC 先生进程”接收到信号时会发生什么。
    • 不,kill 默认发送SIGTERM 是终止信号,而不是SIGINT
    • @Christoffer Hammarström:你是对的!谢谢;我在回复中澄清了。
    【解决方案2】:

    我假设您在谈论 SIGKILL,所以我将只讨论该信号。

    当一个进程对另一个进程发出 SIGKILL 信号时,SIGKILL 会作为挂起信号添加到受害进程上,并且任何挂起的 SIGSTOP、SIGTSTP、SIGTTOU 或 SIGTTIN 信号都会被清除。如果受害者停止或处于可中断的睡眠状态,它就会被唤醒(使其可运行)。

    当受害者进程下一次尝试从内核模式进入用户模式时,会检查挂起的信号。这是找到挂起的 SIGKILL 的地方,内核调用 do_exit() 而不是返回用户模式。

    从内核模式到用户模式的转换将在下一次调度进程时进行(除非它处于不间断睡眠 - 这是臭名昭著的 D 状态)。如果它处于不可中断的睡眠状态,则进程在唤醒之前不会尝试返回用户模式。

    【讨论】:

      【解决方案3】:

      每个进程可以接收多种类型的信号,它可以忽略处理,但很少有没有传递给进程,但“进程调度程序”终止进程.... 看到这个以获得更多解释 http://www.linux-tutorial.info/modules.php?name=MContent&pageid=289

      【讨论】:

        【解决方案4】:

        使用 SIGKILL 以外的信号杀死它,只会导致发送信号。这可以被屏蔽或忽略,但假设它不是(或在它被取消屏蔽之后),那么它会中断程序的正常运行。

        如果正在进行 IPC 类型的系统调用(例如,从套接字读取、select()、poll()、sleep() 等),那么它将被中断并在 errno 中显示 EINTR 失败。正确编写的应用程序将在处理信号后重新发出调用。

        然后进程立即执行对信号处理程序的调用,该处理程序可能返回以允许处理继续,或者它可能调用 longjmp(在 C 中),或者它可能退出进程,这通常是默认设置。

        SIGKILL 完全不同,以上都没有发生。相反,它只是退出系统调用(如果允许进程读取它,这可能会将 EINTR 留在 errno 中),然后导致任务立即退出而无法处理它。

        但我认为它们中的任何一个都在等待“D”“不间断睡眠”状态完成。这通常是诸如阻塞磁盘读取、页面错误请求加载之类的东西。

        【讨论】:

        • longjmp() 不是异步安全的,不应从信号处理程序中调用。
        • SIGSTOP 也不能被屏蔽或忽略。
        • sigjuice:有些人似乎还是从信号处理程序调用 longjmp :)
        • EINTR 不会返回,除非您安装了中断信号处理程序,或者使用 sigaction 并省略了 SA_RESTART 标志,或者如果您的系统的 signal 函数默认中断(它没有打开健全的系统,如 Linux 和 BSD)。
        【解决方案5】:

        杀死(而不是中断)通常由 UNIX 系统中的 SIGKILL 信号执行(CTRL-C 发送 SIGINT)。

        这些系统通常提供一种通过信号中断阻塞系统调用的方法,该方法允许信号处理程序执行而无需等待系统调用完成(这就是 EINTR 错误发挥作用的地方)。所以通常,调用只是被取消,而不是等待它完成。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-28
          • 2015-08-25
          • 1970-01-01
          • 1970-01-01
          • 2011-01-22
          • 2018-11-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多