// Sometimes we'd like our Go programs to intelligently // handle [Unix signals](http://en.wikipedia.org/wiki/Unix_signal). // For example, we might want a server to gracefully // shutdown when it receives a `SIGTERM`, or a command-line // tool to stop processing input if it receives a `SIGINT`. // Here's how to handle signals in Go with channels. package main import ( "fmt" "os" "os/signal" "syscall" ) func main() { // Go signal notification works by sending `os.Signal` // values on a channel. We'll create a channel to // receive these notifications. // **Note:** this channel is "buffered". sigs := make(chan os.Signal, 1) // `signal.Notify` registers the given channel to // receive notifications of the specified signals. signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) fmt.Println("awaiting signal") // The `sigs` channel being buffered, the program // will wait here until it gets the expected signal and // then exit. sig := <-sigs fmt.Println() fmt.Println(sig) fmt.Println("exiting") }