linux 如何终止进程

How linux terminate processes

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

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

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

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

Does process have cancellation points like pthread?

没有

Does SIGKILL take those cancellation points into account?

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

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

Does signal change process states to run signal handler?

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

If yes, does it mean a process will never terminate itself when it never get cpu.

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

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