Golang 父进程退出,子进程为何不退出?

在 Golang 中,父进程退出时子进程并不会自动退出。这是因为 Go 将子进程视为独立的进程,即使由父进程创建,它们之间也没有直接的父子关系。

如何实现父进程退出时自动终止子进程?

要实现父进程退出时自动终止子进程,可以使用 os/exec 包中的 Command 对象启动子进程,并在父进程退出时调用 Command 对象的 Process.Kill() 方法强制终止子进程。

以下是一个示例代码:

package main

import (
    'fmt'
    'os'
    'os/exec'
    'syscall'
)

func main() {
    cmd := exec.Command('sleep', '10')
    err := cmd.Start()
    if err != nil {
        fmt.Println('Failed to start command:', err)
        os.Exit(1)
    }

    // 在父进程退出时强制终止子进程
    defer func() {
        fmt.Println('Parent process is exiting...')
        cmd.Process.Signal(syscall.SIGTERM) // 发送 SIGTERM 信号
        cmd.Process.Wait()                // 等待子进程退出
    }()

    fmt.Println('Parent process is running...')
    os.Exit(0)
}

代码解释:

  1. 使用 exec.Command() 创建一个 Command 对象来启动名为 'sleep' 的子进程。
  2. 调用 cmd.Start() 启动子进程。
  3. 使用 defer 关键字确保在父进程退出时执行终止子进程的操作。
  4. 调用 cmd.Process.Signal(syscall.SIGTERM) 发送 SIGTERM 信号给子进程,请求其终止。
  5. 调用 cmd.Process.Wait() 等待子进程退出,确保子进程资源得到释放。

通过以上方法,即可在 Golang 中实现父进程退出时自动终止子进程,保证程序的稳定性和资源的合理利用。

Golang 父进程退出时如何自动终止子进程

原文地址: https://www.cveoy.top/t/topic/jmwv 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录