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

如果父进程终止则 kill exec

如果父进程终止则 kill exec

Go
喵喵时光机 2023-03-07 14:24:09
我有一段代码如下:func Foo() {    cmd := exec.Command("command that takes a long time")    err = cmd.Start()    if err != nil {        panic(err)    }    return}func main() {    Foo()    panic("program quit abruptly")}即使主进程结束,睡眠命令仍将处于活动状态,是否可以链接这些,以便cmd如果父进程被杀死?
查看完整描述

1 回答

?
红颜莎娜

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

如果您希望在程序退出时终止您启动的进程,那么您可以注入一个上下文:


func Foo(ctx context.Context) {

    cmd := exec.CommandContext(ctx, "command that takes a long time")

    _ = cmd.Start()


    return

}


func main() {

    ctx, cancel := context.WithCancel(context.Background())


    Foo(ctx)

    defer cancel()


    panic("program quit abruptly")

}

这段代码通过创建一个带有取消函数的上下文来工作。然后将此上下文发送到Foo命令函数并从那里发送到命令函数。当cancel被调用时,上下文会被取消,导致子进程被杀死。为确保取消上下文,我们将调用推迟到cancel,这可确保在程序出于任何原因(包括恐慌)退出时取消上下文。


如果你的愿望是只在恐慌时取消,你可以main稍微修改一下:


func main() {

    ctx, cancel := context.WithCancel(context.Background())


    Foo(ctx)

    defer func() {

        if r := recover(); r != nil {

            cancel()

        }

    }()


    panic("program quit abruptly")

}


查看完整回答
反对 回复 2023-03-07
  • 1 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号