Signals->시그널
#
// 가끔 우리는 Go 프로그램이 똑똑하게
// [Unix signal](http://en.wikipedia.org/wiki/Unix_signal)
// 을 처리해주길 바랍니다.
// 예를 들어, `SIGTERM` signal을 받았을 때 적절하게 서버를
// 종료하는 경우나 커맨드라인 도구에서 `SIGINT`를 받았을 때
// 프로세스를 멈추는 경우가 그런 경우입니다.
// 여기서는 채널을 이용하여 signal을 다루는 방법을 살펴보겠습니다.
package main
import "fmt"
import "os"
import "os/signal"
import "syscall"
func main() {
// Go의 signal 알림은 `os.Signal` 값을 채널에 보내는 방식으로 작동합니다.
// 이런 알림을 받는 채널을 하나 만들어봅시다.
// (프로그램을 종료해도 될 때를 알려주는 채널도 만들어볼 것입니다.)
sigs := make(chan os.Signal, 1)
done := make(chan bool, 1)
// `signal.Notify`는 우리가 지정한 signal을 받을 수 있는
// 채널을 받고 등록해줍니다.
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
// 이 고루틴은 signal을 받기 위한 블로킹 고루틴입니다.
// Signal을 받으면 받은 signal을 출력하고 프로그램에
// 종료 가능하다고 알려줄 것입니다.
go func() {
sig := <-sigs
fmt.Println()
fmt.Println(sig)
done <- true
}()
// 프로그램은 여기서 원하는 signal을 받을 때까지 기다릴 것입니다.
// (위의 고루틴이 signal을 받으면 `done`에 값을 보내는 것에서
// 알 수 있습니다.)
// 값을 받으면, 종료합니다.
fmt.Println("awaiting signal")
<-done
fmt.Println("exiting")
}
# 이 프로그램을 실행시키면 signal을 받을 때까지 블록될 것입니다.
# `ctrl-C` (^C로 표시됩니다.) 를 눌러서 `SIGINT`를 보낼 수 있습니다.
# SIGINT를 받은 프로그램은 `interrupt`를 출력하고 종료될 것입니다.
$ go run signals.go
awaiting signal
^C
interrupt
exiting