go 監聽系統信號

linux 信號查看

kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

go 標準庫裏提供了 signal.Notify 來獲取系統信號,函數原型以下:linux

func Notify(c chan<- os.Signal, sig ...os.Signal)

Notify函數讓signal包將輸入信號轉發到c。若是沒有列出要傳遞的信號,會將全部輸入信號傳遞到c;不然只傳遞列出的輸入信號。
signal包不會爲了向c發送信息而阻塞(就是說若是發送時c阻塞了,signal包會直接放棄):
調用者應該保證c有足夠的緩存空間能夠跟上指望的信號頻率。對使用單一信號用於通知的通道,緩存爲1就足夠了。shell

能夠使用同一通道屢次調用Notify:每一次都會擴展該通道接收的信號集。惟一從信號集去除信號的方法是調用Stop。
能夠使用同一信號和不一樣通道屢次調用Notify:每個通道都會獨立接收到該信號的一個拷貝。緩存

實踐

咱們能夠起一個 goroutine 來監聽系統信號, 一個 channel 獲取系統信號,另外一個 channel 來控制程序的退出。函數

示例代碼以下:code

package main

import (
    "fmt"
    "os"
    "os/signal"
    "syscall"
)

func main() {
    exitChan := make(chan int)
    signalChan := make(chan os.Signal, 1)
    go func() {
        <-signalChan
        fmt.Println("signal received")
        exitChan <- 1
    }()
    signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
    <-exitChan
}
相關文章
相關標籤/搜索