Skip to content

Latest commit

 

History

History
96 lines (73 loc) · 3.81 KB

kill底层发生了什么.md

File metadata and controls

96 lines (73 loc) · 3.81 KB

在 Unix/Linux 系统中,结束一个进程通常使用 kill 命令或系统调用。这实际上是通过向进程发送一个信号来控制其行为。下面是对如何结束进程以及 kill 底层机制的详细说明。

1. 如何结束一个进程?

使用 kill 命令:

kill 命令用于向指定的进程发送信号。常用的结束进程的信号有:

  • SIGTERM (15):请求进程友好地终止。进程可以捕捉该信号,执行清理操作,然后退出。
  • SIGKILL (9):强制进程立即终止,无法被捕捉或忽略。

命令格式:

kill -SIGTERM <pid>  # 发送 SIGTERM 信号
kill -9 <pid>        # 发送 SIGKILL 信号,强制终止进程

使用 Go 代码终止进程:

在 Go 中,可以使用 os.ProcessKill() 方法来结束进程。

package main

import (
    "fmt"
    "os"
    "os/exec"
)

func main() {
    cmd := exec.Command("sleep", "60")
    cmd.Start()
    fmt.Printf("Started process with pid %d\n", cmd.Process.Pid)

    // 结束进程
    cmd.Process.Kill()
    fmt.Println("Process killed")
}

2. kill 的底层机制(信号机制)

信号的概念

在 Unix 系统中,信号(signal)是一种用于进程间通信的机制,操作系统通过向进程发送信号来通知事件的发生。每个信号都有一个唯一的整数编号和名字,例如:

  • SIGINT (2):中断信号,通常由用户按下 Ctrl+C 触发。
  • SIGTERM (15):请求进程友好地终止。
  • SIGKILL (9):强制立即终止进程,无法捕获或忽略。

信号的工作流程

当用户使用 kill 命令或调用系统函数 kill() 时,操作系统会向目标进程发送信号,信号的处理流程如下:

  1. 内核发送信号:系统调用 kill(pid, signal) 会让操作系统内核将指定的信号发送到进程控制块中。pid 指定目标进程,signal 指定信号编号。

  2. 进程接收信号:每个进程都有一个信号处理函数表,指示该进程如何处理不同的信号。当进程接收到信号后,操作系统会查询进程的信号处理表:

    • 如果进程注册了信号处理程序(例如 SIGTERM),系统会调用该处理程序来执行清理操作或其他逻辑。
    • 如果进程没有处理该信号的程序,默认的处理方式会被触发,例如终止进程或忽略信号。
  3. 信号处理

    • SIGTERM:默认情况下,进程收到 SIGTERM 时会友好退出。进程可以通过捕捉这个信号来处理退出时的清理工作。
    • SIGKILL:这个信号不能被捕获、阻塞或忽略,操作系统会立即终止进程,清理所有资源。

信号的特点:

  • 可捕获信号:如 SIGTERM,允许进程处理信号,可以执行清理工作,然后自行退出。
  • 不可捕获信号:如 SIGKILL,进程无法捕捉或处理,操作系统强制终止进程。

信号处理示例(Go 代码捕获信号):

在 Go 中,os/signal 包可以用于捕获信号并处理。

package main

import (
    "fmt"
    "os"
    "os/signal"
    "syscall"
)

func main() {
    // 创建一个通道来接收信号
    sigs := make(chan os.Signal, 1)

    // 注册信号到通道
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    // 等待信号
    fmt.Println("Waiting for signal...")
    sig := <-sigs
    fmt.Println("Received signal:", sig)

    // 执行清理操作后退出
    fmt.Println("Exiting gracefully...")
}

总结

  • 结束进程:使用 kill 命令可以向进程发送不同的信号来控制其行为,最常见的信号是 SIGTERMSIGKILL
  • 信号机制kill 通过内核向进程发送信号,进程可以捕捉某些信号进行处理,但 SIGKILL 不可捕捉,操作系统会强制终止进程。