为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕哥9229398 2021-06-30 10:43:56
我在golang中发现了一个奇怪的问题。exec.Start()如果父程序被os.Interrupt信号中断,则执行的程序会退出,而如果父程序正常退出,则子程序不会退出。这两种情况有什么区别?举些例子:package mainimport "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 秒之后。
查看完整描述

2 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

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

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


查看完整回答
反对 回复 2021-07-05
  • 2 回答
  • 0 关注
  • 281 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信