ときには、Go プログラムで
Unix シグナル
を扱いたいこともあります。例えば、 |
|
package main |
|
import ( "fmt" "os" "os/signal" "syscall" ) |
|
func main() { |
|
Go のシグナル通知は、チャネルに |
sigs := make(chan os.Signal, 1) |
|
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) |
main 関数で |
done := make(chan bool, 1) |
このゴルーチンは、シグナルを同期的に受信します。 シグナルを受信したら、それを表示して、 プログラムに終了できることを通知します。 |
go func() { |
sig := <-sigs fmt.Println() fmt.Println(sig) done <- true }() |
|
プログラムはシグナルを受信するまで
(前述の |
fmt.Println("awaiting signal") <-done fmt.Println("exiting") } |
このプログラムを実行すると、シグナルを待ってブロックします。
|
$ go run signals.go awaiting signal ^C interrupt exiting |
Next example: Exit.