有时候我们希望我们的Go程序能够智能地处理Unix信号。例如,我们可能希望服务器在接收到SIGTERM时能够优雅地关闭,或者命令行工具在接收到SIGINT时停止处理输入。以下是如何在Go中使用通道处理信号的方法。
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
)
func main() {
// Go信号通知通过在一个通道上发送os.Signal值来工作。我们将创建一个通道来接收这些通知。注意,这个通道应该是带缓冲的。
sigs := make(chan os.Signal, 1)
// signal.Notify注册给定的通道以接收指定信号的通知。
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
// 我们可以在主函数中从sigs接收信号,但让我们看看如何在单独的goroutine中完成这个操作,以展示一个更现实的优雅关闭场景。
done := make(chan bool, 1)
// 这个goroutine执行一个阻塞的信号接收操作。当它接收到一个信号时,它会打印出来,然后通知程序它可以完成。
go func() {
sig := <-sigs
fmt.Println()
fmt.Println(sig)
done <- true
}()
// 程序将在这里等待,直到它接收到预期的信号(如上所述,goroutine在done上发送一个值表示),然后退出。
fmt.Println("awaiting signal")
<-done
fmt.Println("exiting")
}
运行结果:
➜ go run signals.go
awaiting signal
^C
interrupt
exiting
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。