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.go
的HandleInterrupts
方法,监听系统SIGINT
与SIGTERM
信号,并在收到信号之后,执行清理工作。