代码之家  ›  专栏  ›  技术社区  ›  Vivek Sharma

“杀戮”是如何起作用的?特别是,“杀戮”是如何处理被阻止的进程的?

  •  2
  • Vivek Sharma  · 技术社区  · 17 年前

    内核中的谁负责杀死进程。

    如果一个“杀戮”出现,并且进程处于阻塞状态,该怎么办?杀戮是否等到进程进入运行状态才进行自我清理?

    如果有人可以从内核方面回答更多问题,比如当kill命令生成sigint时,内核将调用所有这些操作,直到最后清除TCB(任务控制块)。

    5 回复  |  直到 14 年前
        1
  •  7
  •   caf    17 年前

    我猜你是在谈论西格基尔,所以我只讨论那个信号。

    当一个进程在另一个进程上引发sigkill时,sigkill被添加为受害者进程上的挂起信号,并且清除任何挂起的sigstop、sigstp、sigttou或sigttin信号。如果受害者停止或处于可中断睡眠状态,则会被唤醒(使其可运行)。

    当受害者进程下次尝试从内核模式转到用户模式时,将检查挂起的信号。这就是找到挂起sigkill的地方,内核调用执行exit()而不是返回到用户模式。

    从内核模式到用户模式的转换将在下一次调度进程时进行(除非进程处于不间断睡眠状态——这是臭名昭著的D状态)。如果它在一个不可预知的睡眠中,这个过程不会试图回到用户模式,直到它醒来。

        2
  •  5
  •   MarkR    17 年前

    用除sigkill以外的信号杀死它,只会导致发送一个信号。这可以被屏蔽或忽略,但是假设它没有被屏蔽(或者在它被屏蔽之后),那么它会中断程序的正常运行。

    如果正在进行IPC类型的系统调用(例如,从套接字读取、select()、poll()、sleep()等),那么它将中断,并在errno中的eintr失败。正确的书面申请将在处理信号后重新发出呼叫。

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

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

    但我认为它们中的任何一个都会等待“d”“不间断睡眠”状态结束。这通常类似于一个阻塞的磁盘读取、页面错误请求加载或其他。

        3
  •  1
  •   joeslice    14 年前

    运行kill只是向进程(术语)发送一个信号,要求它很好地终止。如果它不回应,那就是生意。但是,您可以选择发送 several different signals 命令它离开。你可能感兴趣的是杀戮-9(sigkill),它可以杀死它而不给它一个选择。

    (编辑:正如评论中指出的,术语是默认值)

        4
  •  0
  •   Matthew Iselin    17 年前

    在UNIX系统中,杀戮(而不是中断)通常由sigkill信号执行(ctrl-c发送sigint)。

    这些系统通常提供一种通过信号中断阻塞系统调用的方法,该方法允许信号处理程序在不等待系统调用完成的情况下执行(这就是EINTR错误发挥作用的地方)。所以 正常地 ,呼叫刚刚取消,不等待完成。

        5
  •  0
  •   Anurag Uniyal    17 年前

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