亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果父進程終止則 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條經驗 獲得超13個贊

如果您希望在程序退出時終止您啟動的進程,那么您可以注入一個上下文:


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 關注
  • 147 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號