Signaux

Signaux #

// Parfois, on voudrait que les programmes en Go gèrent intelligemment les [signaux Unix](http://en.wikipedia.org/wiki/Unix_signal).
// Par exemple, on peut vouloir qu'un serveur s'éteigne gracieusement lorsqu'il reçoit le signal `SIGTERM`, ou un qu'outil en ligne de commande arrête de traiter les entrées lorsuq'il reçoit un `SIGINT`.
// Voici comment gérer les signaux en Go avec des canaux.

package main

import "fmt"
import "os"
import "os/signal"
import "syscall"

func main() {

    // Go signale les travaux de notification en envoyer des valeurs `os.Signal` sur un canal. Nous allons créer un canal pour recevoir ces notifications. Nous allons aussi en faire un pour nous notifier quand le programme peut se terminer.
    sigs := make(chan os.Signal, 1)
    done := make(chan bool, 1)

    // `signal.Notify` enregistre le canal fournit pour recevoir les notifications sur les signaux précisés.
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    // Cette goroutine exécute une réception bloquante des signaux. Quand elle se termine, elle l'affichera et notifiera le programme qu'il peut terminer.
    go func() {
        sig := <-sigs
        fmt.Println()
        fmt.Println(sig)
        done <- true
    }()

    // Le programme va attendre ici jusqu'à ce qu'il reçoive le signal attendu (comme indiqué par la goroutine au dessus, qui envoit une valeur sur `done`), puis termine.
    fmt.Println("awaiting signal")
    <-done
    fmt.Println("exiting")
}
# Quand on lance ce programme, il va bloquer, en
# attendant un signal. En faisant `ctrl-C` (que le 
# terminal montre comme `^C`), on peut envoyer un
# signal `SIGINT`, qui amène le programme à afficher
# `interrupt` et puis termine.
$ go run signals.go
awaiting signal
^C
interrupt
exiting