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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

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

这在戈朗有可能吗?

注意:当我第一次发布这个问题时,我对Ctrl+C是什么感到困惑SIGTERM而不是SIGINT.

提问于
用户回答回答于

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

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

用户回答回答于

这样做是可行的:

package main

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

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

func main() {
    c := make(chan os.Signal, 2)
    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
    }
}

扫码关注云+社区