LoginSignup
29
22

More than 5 years have passed since last update.

Go言語でCtrl+Cなどのシグナルを検知する

Last updated at Posted at 2018-04-18

プロセス実行中に 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("シグナル受信")
}
29
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
22