gpt4 book ai didi

go - 终止过程:消音和终止信号之间的区别

转载 作者:行者123 更新时间:2023-12-01 22:11:10 25 4
gpt4 key购买 nike

func main() {
ctx, cancel := context.WithCancel(context.Background())
cmd := exec.CommandContext(ctx, "sleep", "1000")

go func() {
time.Sleep(2 * time.Second)
//cmd.Process.Signal(os.Kill)
//cmd.Process.Signal(os.Interrupt)
cancel()

}()

if err := cmd.Run(); err != nil {
fmt.Println(err.Error())
}

fmt.Println("Finishing...")
}

cancelSignal(os.Kill)之间有什么区别吗?它们会导致相同的错误。
如何区分终止信号和由于错误而终止?仅通过检查 err.Error() == "signal: killed"吗?

最佳答案

exec.CommandContext的文档为您提供了这一答案:

如果上下文在命令本身完成之前完成,则提供的上下文用于终止进程(通过调用os.Process.Kill)。

依次,os.Process.Kill调用特定于os的kill()函数,posix的以下函数:

func (p *Process) kill() error {
return p.Signal(Kill)
}
因此,两者最终都调用了 Signal(os.Kill)
至于如何区别,您有两个基本选择:
  • 解析可能是脆弱的错误(尽管直接对signal: killed进行检查不是太糟糕
  • 检查退出代码,当被SIGKILL终止时应该为137,应该是137。

  • 关于go - 终止过程:消音和终止信号之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63582844/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com