Go SIGINT(终端中断信号)和 SIGTERM(终止信号)signal.Notify 通知信号函数
signal.Notify 是 Go 语言中用于通知信号的函数。在这个特定的例子中,它的作用是捕获 SIGINT(终端中断信号)和 SIGTERM(终止信号)这两个系统信号。
signal.Notify 函数接受一个信号通道和一个或多个要捕获的信号作为参数。在你的代码中,interrupt 是一个用于接收信号的通道。
当程序运行时,如果操作系统向该程序发送 SIGINT 或 SIGTERM 信号,signal.Notify 将会将这些信号发送到 interrupt 通道。你可以在代码的其他地方监听该通道,以便在接收到这些信号时执行一些特定的逻辑,比如进行清理操作或优雅地终止程序运行。
下面是一个简单的例子,展示了如何使用 signal.Notify 和 interrupt 通道来捕获和处理这些信号:
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
)
func main() {
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, syscall.SIGINT, syscall.SIGTERM)
// 在另一个 goroutine 中监听信号通道
go func() {
sig := <-interrupt
fmt.Println("接收到信号:", sig)
// 执行一些清理操作或其他逻辑
// ...
os.Exit(0) // 优雅地终止程序
}()
// 这里可以写你的程序主逻辑
// ...
// 阻塞主 goroutine,使程序保持运行状态
select {}
}
以上代码创建了一个信号通道 interrupt,并将 SIGINT 和 SIGTERM 这两个信号注册到该通道中。
然后,在另一个 goroutine 中,通过从 interrupt 通道接收信号,来处理这些信号。
程序的主逻辑可以写在注释部分的位置。
要测试这个示例,你可以按照以下步骤进行:
1 将示例代码保存到一个名为 main.go 的文件中。
2 打开终端,并导航到包含 main.go 文件的目录。
3 使用以下命令来构建并运行程序:
go run main.go
这将编译并运行 Go 程序。
4 在程序运行时,你可以按下 Ctrl+C 来发送 SIGINT 信号,或者使用操作系统的终止命令来发送 SIGTERM 信号。
5 在终端中,你会看到打印出的消息,确认程序接收到了信号并执行了相应的逻辑。
6 如果一切顺利,你会看到程序优雅地终止。
请注意,示例中的 select {} 用于阻塞主 goroutine,以保持程序运行状态。你可以根据实际需求来修改这部分逻辑,例如添加其他的处理逻辑或条件判断。
PS E:\TEXT\test> go run .\test.go
接收到信号: interrupt
PS E:\TEXT\test>