【发布时间】:2013-09-20 04:14:32
【问题描述】:
我对 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
}
}
【问题讨论】:
-
您到底想在
SIGHUP上做什么?大多数 Go 程序实际上并没有主循环的概念,但您可以通过另一个通道轻松地在 goroutine 之间传递通知。 -
您应该熟悉频道,恕我直言。他们做你想做的事。
-
@JamesHenstridge 我在主处理和信号处理之间添加了一个通道,但它似乎不起作用。