前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Go程序例子(82):信号

Go程序例子(82):信号

原创
作者头像
用户11078756
发布2025-01-21 09:58:26
发布2025-01-21 09:58:26
4600
代码可运行
举报
文章被收录于专栏:go程序例子go程序例子
运行总次数:0
代码可运行

有时候我们希望我们的Go程序能够智能地处理Unix信号。例如,我们可能希望服务器在接收到SIGTERM时能够优雅地关闭,或者命令行工具在接收到SIGINT时停止处理输入。以下是如何在Go中使用通道处理信号的方法。

代码语言: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")
}

运行结果:

代码语言:javascript
代码运行次数:0
复制
➜ go run signals.go           
awaiting signal
^C
interrupt
exiting

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档