使用「Defer」進行訊號處理與清理
在程式設計中,通常需要在中斷某個訊號時執行清理或錯誤處理操作正在執行的進程,例如使用者按Ctrl C (SIGINT) 來終止程式時。 「defer」關鍵字提供了一種便捷的方法來確保此類操作在程式退出之前執行。
捕獲SIGINT 訊號
要捕捉SIGINT 訊號,您可以可以使用os/signal包,它提供了處理傳入的函數
package main import ( "fmt" "os" "os/signal" ) // main function func main() { gracefulExit() } // Listen for and handle Ctrl+C (SIGINT) signal func gracefulExit() { // Create a channel to receive signals on sigs := make(chan os.Signal, 1) // Register SIGINT (Ctrl+C) signal handler signal.Notify(sigs, os.Interrupt) // Start a goroutine to listen for signals go func() { sig := <-sigs fmt.Printf("Received %v signal. Cleaning up and exiting...\n", sig) // Trigger cleanup actions using "defer" defer cleanup() defer saveResults() os.Exit(0) }() // Start running the program's main logic runProgram() }
執行延遲操作
在訊號處理goroutine 中,在終止程序之前,可以使用 defer 關鍵字來定義清理操作,這些操作將執行依照其宣告的相反順序執行。在上面的範例中,cleanup() 和 saveResults() 函數將在程式退出之前被呼叫。
自訂清理行為
實際需要執行的清理操作接收到 SIGINT 訊號時執行的操作將根據程式的特定需求而有所不同。這種靈活性使得使用「延遲」進行訊號處理和清理成為一種通用且有效的技術,用於管理程式碼中的意外中斷。
以上是如何「延遲」確保 Go 中 SIGINT 訊號的乾淨程序退出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!