【问题标题】:How linux terminate processeslinux如何终止进程
【发布时间】:2020-06-17 03:09:55
【问题描述】:

我想知道一些关于进程终止的细节。谢谢。 进程是否有像 pthread 这样的取消点? 如果是,它们是什么? SIGKILL 是否将这些取消点考虑在内? 信号是否会更改进程状态以运行信号处理程序?如果是,是否意味着一个进程永远不会在没有得到 cpu 时终止自己。

【问题讨论】:

    标签: linux process linux-kernel pthreads sigkill


    【解决方案1】:

    在 Linux 中,当一个进程被杀死时,会向该进程传递一个“终止信号”。尽管有许多不同类型的信号,但我们主要处理“SIGTERM”和“SIGKILL”信号。它们的数值分别为 15 和 9。

    默认情况下,所有的进程终止命令都使用“SIGTERM”,它允许程序在退出之前运行一些代码,从而允许它“优雅地”终止。

    如果要强制终止进程,可以使用“SIGKILL”代替。

    【讨论】:

      【解决方案2】:

      进程是否有像 pthread 这样的取消点?

      没有。

      SIGKILL 会考虑这些取消点吗?

      没有,因为没有。当SIGKILL 被传递给一个进程时,它就会死掉。如果它正在等待任何系统调用完成,那么这些等待将被中断。没有线程进行任何进一步的计算或执行任何清理,但操作系统执行的终止清理(关闭打开的文件,释放内存,......)通常仍然发生。 SIGKILL 不能被捕获、阻止或忽略。

      比较SIGTERM,更温和一点。当进程收到SIGTERM 时,可能会通过阻塞它或通过忽略它来阻止它,结果取决于是否为它注册了信号处理程序。如果是这样,则选择接收信号的线程正在执行的任何系统调用都会被中断,并调用信号处理程序。附加效果是特定于程序的。如果没有注册处理程序,则程序跳到执行干净(-ish)终止,包括在实际终止之前调用已注册的退出处理程序。

      信号是否会改变进程状态以运行信号处理程序?

      我不确定您的意思是什么,但在 SIGKILL 案例中没有调用信号处理程序。然而,更广泛地说,当信号处理程序确实运行时,例如可能发生在 SIGTERM 情况下,它们相对于它们运行的​​线程的执行是异步的。

      如果是,是否意味着一个进程永远不会在它永远不会获得 cpu 时终止自己。

      通过传递SIGKILL 来终止进程不需要进程的任何合作。所涉及的所有重要操作都由内核执行,并且由于它负责调度执行资源,因此您不能轻易拒绝内核所需的任何 CPU 时间。

      另一方面,将SIGTERM 传递给进程并不总是能成功终止进程。进程可以阻塞或忽略信号,或者在不终止的情况下处理它。即使它没有做这些事情,它的退出处理程序(如果有的话)将在它终止之前运行,并且这些可以无限期地延迟它的实际终止。原则上,您可以通过阻止进程被调度任何 CPU 时间来阻止终止完成。

      【讨论】:

      • 非常感谢。看了一些内核代码,好像SIGKILL handler也是被目标进程执行的(当然进程对handler什么都做不了),所以我猜肯定有SIGKILL不能工作的一些情况。对于“信号是否改变进程状态以运行信号处理程序”的问题,我的意思是如果操作系统挂起或阻塞,操作系统必须将目标进程状态更改为 TASK_RUNNING,因为所有信号处理程序都必须由目标进程执行。我做错了什么吗?
      • @Alan,SIGKILL 的重点是没有不工作的情况。您似乎专注于实现细节,但这些都是次要的。如果SIGKILL 未能杀死它所交付给的进程,那么这就是操作系统错误的特征。
      猜你喜欢
      • 2016-01-12
      • 2011-07-10
      • 2022-01-19
      • 2014-08-13
      • 2010-11-26
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多