登录
首页 >  Golang >  Go问答

如果父进程终止则终止 exec

来源:stackoverflow

时间:2024-04-02 11:39:35 288浏览 收藏

哈喽!大家好,很高兴又见面了,我是golang学习网的一名作者,今天由我给大家带来一篇《如果父进程终止则终止 exec》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧!

问题内容

我有一段 go 代码,如下所示:

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 将被杀死?


正确答案


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

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")
}

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>