为什么exec.Start()创建的进程如果其父节点被SIGINT杀死则退出?

rpb*_*ear 5 linux fork signals exec go

我在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
} 
Run Code Online (Sandbox Code Playgroud)

在后一种情况下,如果我们不中断主程序,则父级sleep 100000将是20 init process后.

nos*_*nos 11

发生的事情是,如果你发送一个进程SIGINT(例如os.Interrupt),同一进程组中的所有进程也将获得该信号(包括子进程) - SIGINT将默认终止进程.

但是,如果父进程正常退出,而不是因为SIGINT或类似原因,则同一进程组中的进程不会获得任何信号 - 它将继续运行,但会被init进程采用.这不是Go特有的.