2,348
社区成员




import (
"os"
"os/signal"
"fmt"
"sync"
"syscall"
)
func main() {
signal.Ignore(syscall.SIGHUP, os.Interrupt, os.Kill) //这里让本进程忽略中断信号(本来还想忽略Kill信号,但是做不到)
ch := make(chan os.Signal); //信号转发到ch通道
//notify用于监听信号
//参数1表示接收信号的channel
//参数2及后面的表示要监听的信号
//os.Interrupt 表示中断
//os.Kill 杀死退出进程
signal.Notify(ch, os.Interrupt);
//获取信号,如果没有会一直阻塞在这里。
cnt := &sync.WaitGroup{} //这里为了看效果用个同步锁
cnt.Add(5) //为了转发5次中断信号
go func() { //用个协程来接收通道的信号
for {
s := <-ch;
//我们通过Ctrl+C或用taskkill /pid -t -f来杀死进程,查看效果。
cnt.Done() //接收一次中断信号就减少同步锁
fmt.Println("信号:", s);
}
}()
cnt.Wait() //等待同步锁
}