golang中的信号
列出信號
?
發(fā)送信號
kill -SIGKILL PID
信號處理
- 通過kill命令給正在運(yùn)行的程序發(fā)送信號
- 不處理的話,程序會panic處理
Signal handler可以通過signal()系統(tǒng)調(diào)用進(jìn)行設(shè)置。如果沒有設(shè)置,缺省的handler會被調(diào)用,當(dāng)然進(jìn)程也可以設(shè)置忽略此信號。
 有兩種信號不能被攔截和處理:SIGKILL和SIGSTOP
當(dāng)接收到信號時,進(jìn)程會根據(jù)信號的響應(yīng)動作執(zhí)行相應(yīng)的操作,信號的響應(yīng)動作有以下幾種:
- 中止進(jìn)程(Term)
- 忽略信號(Ign)
- 中止進(jìn)程并保存內(nèi)存信息(Core)
- 停止進(jìn)程(Stop)
- 繼續(xù)運(yùn)行進(jìn)程(Cont)
用戶可以通過signal或sigaction函數(shù)修改信號的響應(yīng)動作(也就是常說的“注冊信號”)。另外,在多線程中,各線程的信號響應(yīng)動作都是相同的,不能對某個線程設(shè)置獨(dú)立的響應(yīng)動作。
信號介紹
- Ctrl-C 發(fā)送 INT signal (SIGINT),通常導(dǎo)致進(jìn)程結(jié)束
- Ctrl-Z 發(fā)送 TSTP signal (SIGTSTP); 通常導(dǎo)致進(jìn)程掛起(suspend)
- Ctrl-\ 發(fā)送 QUIT signal (SIGQUIT); 通常導(dǎo)致進(jìn)程結(jié)束 和 dump core.
- Ctrl-T (不是所有的UNIX都支持) 發(fā)送INFO signal (SIGINFO); 導(dǎo)致操作系統(tǒng)顯示此運(yùn)行命令的信息
個平臺的信號定義或許有些不同。下面列出了POSIX中定義的信號。
 Linux 使用34-64信號用作實(shí)時系統(tǒng)中。
 命令man 7 signal提供了官方的信號介紹。
在POSIX.1-1990標(biāo)準(zhǔn)中定義的信號列表
?
?
信號處理
package mainimport "fmt" import "os" import "os/signal" import "syscall"func main() {// Go信號通知通過向一個channel發(fā)送``os.Signal`來實(shí)現(xiàn)。// 我們將創(chuàng)建一個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阻塞等待信號的到來,當(dāng)信號到來的時候,// 輸出該信號,然后通知程序可以結(jié)束了go func() {sig := <-sigsfmt.Println()fmt.Println(sig)done <- true}()// 程序?qū)⒌却邮苄盘?#xff0c;然后退出fmt.Println("awaiting signal")<-donefmt.Println("exiting") }當(dāng)運(yùn)行程序的時候,程序?qū)⒆枞却盘柕牡絹?#xff0c;我們可以使用CTRL+C來發(fā)送一個SIGINT信號,這樣程序就會輸出interrupt后退出。
awaiting signalinterrupt exiting總結(jié)
以上是生活随笔為你收集整理的golang中的信号的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: golang中的bufio
- 下一篇: golang中的plugin包
