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 }