プロセス実行中に Ctrl+C だのを叩いた(シグナルを送った)とき、その通知をプログラム内で受け取る。シグナルハンドリング。
##基本
signal.go
package main
import (
"os"
"os/signal"
)
func main() {
// シグナル用のチャネル定義
quit := make(chan os.Signal)
// 受け取るシグナルを設定
signal.Notify(quit, os.Interrupt)
<-quit // ここでシグナルを受け取るまで以降の処理はされない
// シグナルを受け取った後にしたい処理を書く
}
ここで設定した"os.Interrupt"は、Ctrl+C で中断されるときに送られるシグナル(SIGINT)のこと。割り込みを意味するシグナル。
※osパッケージで定義されてるこれ→ Interrupt Signal = syscall.SIGINT
その他のシグナルを設定したい場合、こちらの一覧から探してみてください
###複数のシグナルを受け取りたいとき
上記コードの signal.Notify() の引数をいじるだけ。
// 受け取るシグナルを設定(検知したいシグナルを引数にどんどん入れていく)
signal.Notify(quit, syscall.SIGHUP, syscall.SIGINT)
※ この例の場合、"syscall" の import も忘れずに。
##何か処理しながらシグナルを待つ
・メイン処理実行
・…してる間もシグナル待機
・シグナルを検知したらサブ処理を実行
↓↓
signal_2.go
package main
import (
"os"
"os/signal"
"fmt"
"time"
)
func main() {
// シグナル待機中にやりたい処理 ※goroutine(並行処理)で書く
/////////////////////////////////////
go func() {
for {
time.Sleep(2 * time.Second)
fmt.Println("処理中...")
}
}()
/////////////////////////////////////
// シグナル用のチャネル定義
quit := make(chan os.Signal)
// 受け取るシグナルを設定
signal.Notify(quit, os.Interrupt)
<-quit // ここでシグナルを受け取るまで以降の処理はされない
// シグナルを受け取った後にしたい処理を書く
fmt.Println("シグナル受信")
}