我对 Go 很陌生,并且一直在试图弄清楚如何处理需要返回主循环的事件。
在 C 中,我可以只返回函数,但似乎我不能在这里这样做,至少用那个方法是这样。
我可以处理需要在 sigHandler() 中处理的信号,即 SIGINT 或 SIGTERM 但我需要在处理 SIGHUP 或 SIGUSR 时将调用返回到 main。在我下面的代码中,一旦我发送挂断信号,进程就会陷入等待模式。
如果有人可以帮助我指导我如何正确设计信号处理以处理需要返回到第一个 goroutine 中的主代码的调用,我将不胜感激。
编辑
我现在在 select{} 中的主 goroutine 中处理通道消息,但是当我发送 HUP 信号时,下面的代码退出。这里的目标是重新加载配置并继续正常执行。
在主线代码中,我有这个:
go sigHandler()
cs := make(chan bool, 1)
go sigHandler(cs)
// setup the http server
err := setupServer(addr, port)
if err != nil {
fatal("Error setting up listening sockets")
os.Exit(1)
}
select {
case quit := <-cs:
if quit {
logEvent(loginfo, sys, "Terminating..")
closeLog()
os.Exit(0)
} else {
logEvent(loginfo, sys, "Reloading configuration..")
}
}
函数 sigHandler()
func sigHandler(cs chan bool) {
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)
signal := <-c
logEvent(lognotice, sys, "Signal received: "+signal.String())
switch signal {
case syscall.SIGINT, syscall.SIGTERM:
cs <- true
case syscall.SIGHUP:
cs <- false
}
}
噜噜哒
慕雪6442864
相关分类