6

我在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将是20s 后。init process

4

2 回答 2

12

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

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

于 2013-10-08T10:31:09.507 回答
1

我认为这是因为您使用Start的是Run.

Start 启动指定的命令,但不等待它完成。

然而:

Run 启动指定的命令并等待它完成。

因此Start只会在 Go(父)进程退出时将进程移交给操作系统。

于 2013-10-08T10:12:57.293 回答