linux 第41章 kill底层发生了什么 linux 第41章 kill底层发生了什么

15小时前

在 Unix/Linux 系统中,结束一个进程通常使用 kill 命令或系统调用。

这实际上是通过向进程发送一个信号来控制其行为。

下面是对如何结束进程以及 kill 底层机制的详细说明。

一、如何结束一个进程?

使用 kill 命令:

kill 命令用于向指定的进程发送信号。

常用的结束进程的信号有:

  • **SIGTERM (15)**:请求进程友好地终止。进程可以捕捉该信号,执行清理操作,然后退出。

  • **SIGKILL (9)**:强制进程立即终止,无法被捕捉或忽略。

命令格式:

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

使用 Go 代码终止进程:

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

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")
}

二、kill 的底层机制

(信号机制)

①、信号的概念

在 Unix 系统中,信号(signal)是一种用于进程间通信的机制,操作系统通过向进程发送信号来通知事件的发生。

每个信号都有一个唯一的整数编号和名字,例如:

  • SIGINT (2):中断信号,通常由用户按下 Ctrl+C 触发。

  • SIGTERM (15):请求进程友好地终止。

  • SIGKILL (9):强制立即终止进程,无法捕获或忽略。

②、信号的工作流程

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

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

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

  • 如果进程注册了信号处理程序(例如 SIGTERM),系统会调用该处理程序来执行清理操作或其他逻辑。

  • 如果进程没有处理该信号的程序,默认的处理方式会被触发,例如终止进程或忽略信号。

③、信号处理

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 命令可以向进程发送不同的信号来控制其行为,最常见的信号是 SIGTERM 和 SIGKILL。

信号机制:kill 通过内核向进程发送信号,进程可以捕捉某些信号进行处理,但 SIGKILL 不可捕捉,操作系统会强制终止进程。

阅读 12

linux文章
带到手机上看