清華尹成帶你實戰GO案例(61)Go 訊號處理

尹成發表於2018-05-22
Go 訊號處理
有的時候我們希望Go能夠智慧地處理Unix訊號。例如我們希望一個server接收到一個SIGTERM的訊號
時,能夠自動地停止;或者一個命令列工具接收到一個SIGINT訊號時,能夠停止接收輸入。現在我們來看
下如何使用channel來處理訊號。

package main
import "fmt"
import "os"
import "os/signal"
import "syscall"
func main() {
// Go訊號通知通過向一個channel傳送``os.Signal`來實現。
// 我們將建立一個channel來接受這些通知,同時我們還用
// 一個channel來在程式可以退出的時候通知我們
sigs := make(chan os.Signal, 1)
done := make(chan bool, 1)
// `signal.Notify`在給定的channel上面註冊該channel
// 可以接受的訊號
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
// 這個goroutine阻塞等待訊號的到來,當訊號到來的時候,
// 輸出該訊號,然後通知程式可以結束了
go func() {
sig := <-sigs
fmt.Println()
fmt.Println(sig)
done <- true
}()
// 程式將等待接受訊號,然後退出
fmt.Println("awaiting signal")
<-done
fmt.Println("exiting")
}


當執行程式的時候,程式將阻塞等待訊號的到來,我們可以使用 CTRL+C 來傳送一個 SIGINT 訊號,這樣
程式就會輸出interrupt後退出。
awaiting signal
interrupt

exiting




網址:http://www.qukuailianxueyuan.io/



欲領取造幣技術與全套虛擬機器資料

區塊鏈技術交流QQ群:756146052  備註:CSDN

尹成學院微信:備註:CSDN



網址:http://www.qukuailianxueyuan.io/



欲領取造幣技術與全套虛擬機器資料

區塊鏈技術交流QQ群:756146052  備註:CSDN

尹成學院微信:備註:CSDN

相關文章