为什么 exec.Start() 创建的进程在其父进程被 SIGINT 杀死时退出?

我在golang中发现了一个奇怪的问题。exec.Start()如果父程序被os.Interrupt信号中断,则执行的程序会退出,而如果父程序正常退出,则子程序不会退出。这两种情况有什么区别?举些例子:


package main


import "fmt"

import "os"

import "time"

import "os/exec"


func main(){

    cmd := exec.Command("sleep", "100000")

    cmd.Env = os.Environ()

    fmt.Println(cmd.Env)

    cmd.Start()


    time.Sleep(1e9*20)

    return

在后一种情况下,如果我们不中断主程序,sleep 100000则的父级将是init process20 秒之后。


慕哥9229398
浏览 282回答 2
2回答

HUWWW

发生的情况是,如果您发送进程 SIGINT(例如 os.Interrupt 所做的),同一进程组中的所有进程也将获得该信号(包括子进程)- SIGINT 默认会终止进程。然而,如果父进程正常退出,不是因为 SIGINT 或类似的原因,同一进程组中的进程不会得到任何信号 - 它会继续运行,但会被 init 进程采用。这不是 Go 特有的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go