golang捕获control+c功能实现

本文详细介绍了使用Go语言处理系统信号的方法,通过示例代码展示了如何注册信号处理器以响应SIGTERM和SIGINT信号,实现优雅地停止程序运行,并在接收到第二次信号时立即退出。

不用多说,直接上代码

package main 

import (
	"os"
	"os/signal"
	"time"
	"syscall"
	"fmt"
)

var onlyOneSignalHandler = make(chan struct{})
var shutdownSignals = []os.Signal{os.Interrupt, syscall.SIGTERM}
// SetupSignalHandler registered for SIGTERM and SIGINT. A stop channel is returned
// which is closed on one of these signals. If a second signal is caught, the program
// is terminated with exit code 1.
func SetupSignalHandler() (stopCh <-chan struct{}) {
	close(onlyOneSignalHandler) // panics when called twice

	stop := make(chan struct{})
	c := make(chan os.Signal, 2) //2表示chan的长度,输入多少次,就可以实现Control+c执行动作多少次
	signal.Notify(c, shutdownSignals...)
	go func() {
		<-c
               fmt.Println("第一次Control+c退出...")
		close(stop)
		<-c
		fmt.Println("第二次Control+c退出....")
		os.Exit(1) // second signal. Exit directly.
	}()

	return stop
}

func Demo(stopCh <-chan struct{}){

   go func() {
		<-stopCh
	}()

}

func main(){
	
	Demo(SetupSignalHandler())
    
     time.Sleep(1*time.Hour) 
      


}

运行结果:

➜  test go run signal.go
^C第一次Control+c退出...
^C第二次Control+c退出....
exit status 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值