Go中的系統Signal處理

2021-08-01 05:13:30 字數 733 閱讀 9674

原文  

我們在生產環境下執行的系統要求優雅退出,即程式接收退出通知後,會有機會先執行一段清理**,將收尾工作做完後再真正退出。我們採用系統signal來 通知系統退出,即kill pragram-pid。我們在程式中針對一些系統訊號設定了處理函式,當收到訊號後,會執行相關清理程式或通知各個子程序做自清理。kill -9強制殺掉程式是不能被接受的,那樣會導致某些處理過程被強制中斷,留下無法恢復的現場,導致訊息被破壞,影響下次系統啟動執行。

最近用golang實現的乙個**程式也需要優雅退出,因此我嘗試了解了一下golang中對系統signal的處理方式,這裡和大家分享。golang 的系統訊號處理主要涉及os包、os.signal包以及syscall包。其中最主要的函式是signal包中的notify函式:

func notify(c chan<- os.signal, sig …os.signal)

該函式會將程序收到的系統signal**給channel c。**哪些訊號由該函式的可變引數決定,如果你沒有傳入sig引數,那麼notify會將系統收到的所有訊號**給c。如果你像下面這樣呼叫notify:

signal.notify(c, syscall.sigint, syscall.sigusr1, syscall.sigusr2)

則go只會關注你傳入的signal型別,其他signal將會按照預設方式處理,大多都是程序退出。因此你需要在notify中傳入你要關注和處理的signal型別,也就是攔截它們,提供自定義處理函式來改變它們的行為。

unix中的signal處理過程

unix中的signal用於通知程序中發生了非同步事件。使用者可以通過kill系統呼叫傳送乙個訊號,kernel自己內部也可以傳送訊號給乙個程序。程序對訊號可以有三種處理方式 忽略,處理和預設 exit 為了傳送乙個訊號給乙個程序,核心設定相對應於訊號的bit位在程序的process table e...

linux中的訊號處理(signal與alarm)

簡單處理程式 函式介紹 alarm 設定訊號傳送鬧鐘 相關函式 signal,sleep 表頭檔案 include 定義函式 unsigned int alarm unsigned int seconds 函式說明 alarm 用來設定訊號sigalrm在經過引數seconds指定的秒數後傳送給目前...

linux中的訊號處理 signal和alarm

訊號是unix中所使用的程序通訊的一種最古老的方法.系統使用它來同志乙個或多個程序非同步事件的發生.linux系統庫bits signum.h對訊號名作了定義 linux的大多數訊號是提供給核心的,僅有少數幾種訊號可以在訊號間傳送.sighup 當終止乙個終端時,核心就把這種訊號傳送給該終端所控制的...