當前位置: 首頁>>編程語言>>正文


Go語言教程:信號

返回Go語言教程首頁

概念簡介

有時候,我們希望 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

信號/signals

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/3973.html,未經允許,請勿轉載。