| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- package daemon
- import (
- "errors"
- "os"
- "os/signal"
- "syscall"
- )
- // ErrStop should be returned signal handler function
- // for termination of handling signals.
- var ErrStop = errors.New("stop serve signals")
- // SignalHandlerFunc is the interface for signal handler functions.
- type SignalHandlerFunc func(sig os.Signal) (err error)
- // SetSigHandler sets handler for the given signals.
- // SIGTERM has the default handler, he returns ErrStop.
- func SetSigHandler(handler SignalHandlerFunc, signals ...os.Signal) {
- for _, sig := range signals {
- handlers[sig] = handler
- }
- }
- // ServeSignals calls handlers for system signals.
- func ServeSignals() (err error) {
- signals := make([]os.Signal, 0, len(handlers))
- for sig := range handlers {
- signals = append(signals, sig)
- }
- ch := make(chan os.Signal, 8)
- signal.Notify(ch, signals...)
- for sig := range ch {
- err = handlers[sig](sig)
- if err != nil {
- break
- }
- }
- signal.Stop(ch)
- if err == ErrStop {
- err = nil
- }
- return
- }
- var handlers = make(map[os.Signal]SignalHandlerFunc)
- func init() {
- handlers[syscall.SIGTERM] = sigtermDefaultHandler
- }
- func sigtermDefaultHandler(sig os.Signal) error {
- return ErrStop
- }
|