是否可以以“延迟”方式捕获 Ctrl C 信号 (SIGINT) 并运行清理功能?

新手上路,请多包涵

我想捕获从控制台发送的 Ctrl+C ( SIGINT ) 信号并打印出一些部分运行总计。

原文由 Sebastián Grignoli 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 532
2 个回答

您可以使用 os/signal 包来处理传入的信号。 Ctrl + CSIGINT ,所以你可以用它来陷阱 os.Interrupt

 c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
go func(){
    for sig := range c {
        // sig is a ^C, handle it
    }
}()

使程序终止和打印信息的方式完全取决于您。

原文由 Lily Ballard 发布,翻译遵循 CC BY-SA 4.0 许可协议

这有效:

 package main

import (
    "fmt"
    "os"
    "os/signal"
    "syscall"
    "time" // or "runtime"
)

func cleanup() {
    fmt.Println("cleanup")
}

func main() {
    c := make(chan os.Signal)
    signal.Notify(c, os.Interrupt, syscall.SIGTERM)
    go func() {
        <-c
        cleanup()
        os.Exit(1)
    }()

    for {
        fmt.Println("sleeping...")
        time.Sleep(10 * time.Second) // or runtime.Gosched() or similar per @misterbee
    }
}

游乐场 结帐

原文由 user246672 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题