Go语言信号(signal)处理

在某些应用中(尤其是生产级程序),需要处理一些系统信号(signal)。比如,当程序收到SIGINT信号时,清理资源,优雅的退出程序。
Go语言的os/signal包提供了系统信号监听机制,用于实现系统信号处理。

关于Linux信号,参见 Linux信号机制

os/signal包的函数

func Ignore(sig ...os.Signal)
func Ignored(sig os.Signal) bool
func Notify(c chan<- os.Signal, sig ...os.Signal)
func Reset(sig ...os.Signal)
func Stop(c chan<- os.Signal)

func Ignore(sig …os.Signal)

Ignore 用于忽略指定的信号,如果没有输入参数,则所有信号都将被忽略。

func Ignored(sig os.Signal) bool

Ignored 返回指定信号当前是否处于被忽略状态。

func Notify(c chan<- os.Signal, sig …os.Signal)

Notify 用于将系统信号分发到c chan
如果没有信号参数输入,则所有信号都将发送到c。发送动作是无阻塞的,所以要求c有足够的缓冲区空间,以跟得上系统的信号速率。
此方法允许 在同一个通道上多次调用Notify,也允许将同一种信号分发到不同的chan,每个chan独立接收输入信号的副本。

func Reset(sig …os.Signal)

Reset将取消先前调用Notify的效果。如果没有信号参数输入,则所有信号都将取消。

func Stop(c chan<- os.Signal)

Stop操作将停止向c chan发送信号。此方法用于取消所有之前对此chan调用Notify的效果。

项目示例

https://github.com/etcd-io/etcd/blob/master/pkg/osutil/interrupt_unix.go

ectd的源码中,pkg/osutil/interrupt_unix.goHandleInterrupts方法,监听系统SIGINTSIGTERM信号,并在收到信号之后,执行清理工作。