ホームページ >バックエンド開発 >Golang >Go の SIGINT シグナルでクリーンなプログラムを確実に終了するにはどうすればよいですか?

Go の SIGINT シグナルでクリーンなプログラムを確実に終了するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-25 01:20:09192ブラウズ

How Can

「遅延」を使用した信号処理とクリーンアップ

プログラミングでは、多くの場合、信号を中断するときにクリーンアップまたはエラー処理アクションを実行することが望ましいです。実行中のプロセス (ユーザーが 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()
}

遅延アクションの実行

シグナル処理ゴルーチン内で、プログラムを終了する前に defer キーワードを使用してクリーンアップ アクションを定義できます。宣言とは逆の順序で実行されます。上の例では、プログラムが終了する前に cleanup() 関数と saveResults() 関数が呼び出されます。

クリーンアップ動作のカスタマイズ

必要な実際のクリーンアップ アクションSIGINT シグナルの受信時に実行される処理は、プログラムの特定のニーズによって異なります。この柔軟性により、「defer」を使用した信号処理とクリーンアップが、コード内の予期しない中断を管理するための多用途かつ効果的な手法になります。

以上がGo の SIGINT シグナルでクリーンなプログラムを確実に終了するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。