概念簡介
有時候,我們希望 Go 能智能的處理 Unix 信號。
例如,我們希望當服務器接收到一個 `SIGTERM` 信號時能夠
自動關機,或者一個命令行工具在接收到一個 `SIGINT` 信號
時停止處理輸入信息。這裏講的就是在 Go 中如何通過通道
來處理信號。
例程代碼
package main
import "fmt"
import "os"
import "os/signal"
import "syscall"
func main() {
// Go 通過向一個通道發送 `os.Signal` 值來進行信號通知。我們
// 將創建一個通道來接收這些通知(同時還創建一個用於在程序可
// 以結束時進行通知的通道)。
sigs := make(chan os.Signal, 1)
done := make(chan bool, 1)
// `signal.Notify` 注冊這個給定的通道用於接收特定信號。
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
// 這個 Go 協程執行一個阻塞的信號接收操作。當它得到一個
// 值時,它將打印這個值,然後通知程序可以退出。
go func() {
sig := <-sigs
fmt.Println()
fmt.Println(sig)
done <- true
}()
// 程序將在這裏進行等待,直到它得到了期望的信號(也就
// 是上麵的 Go 協程發送的 `done` 值)然後退出。
fmt.Println("awaiting signal")
<-done
fmt.Println("exiting")
}
執行&輸出
# 當我們運行這個程序時,它將一直等待一個信號。使用 `ctrl-C`
# (終端顯示為 `^C`),我們可以發送一個 `SIGINT` 信號,這會
# 使程序打印 `interrupt` 然後退出。
$ go run signals.go
awaiting signal
^C
interrupt
exiting
課程導航
學習上一篇Go語言教程:執行進程 學習下一篇Go語言教程:Exit
相關資料
本例程github源代碼:https://github.com/xg-wang/gobyexample/tree/master/examples/signals