Introduction
Le laboratoire Signaux montre comment gérer les signaux Unix dans des programmes Go à l'aide de canaux.
This tutorial is from open-source community. Access the source code
💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici
Le laboratoire Signaux montre comment gérer les signaux Unix dans des programmes Go à l'aide de canaux.
Dans certains cas, nous souhaitons que nos programmes Go gèrent intelligemment les signaux Unix. Par exemple, nous pourrions vouloir qu'un serveur s'arrête proprement lorsqu'il reçoit un SIGTERM
, ou qu'un outil de ligne de commande arrête de traiter l'entrée s'il reçoit un SIGINT
.
os.Signal
.signal.Notify
.## Lorsque nous exécutons ce programme, il bloquera en attendant un
## signal. En appuyant sur `ctrl-C` (que le
## terminal affiche comme `^C`), nous pouvons envoyer un signal `SIGINT`,
## faisant en sorte que le programme affiche `interrupt` puis quitte.
$ go run signals.go
awaiting signal
^C
interrupt
exiting
Voici le code complet ci-dessous :
// Parfois, nous voudrions que nos programmes Go gèrent
// intelligemment les [signaux Unix](https://en.wikipedia.org/wiki/Unix_signal).
// Par exemple, nous pourrions vouloir qu'un serveur s'arrête proprement
// lorsqu'il reçoit un `SIGTERM`, ou qu'un outil de ligne de commande
// arrête de traiter l'entrée s'il reçoit un `SIGINT`.
// Voici comment gérer les signaux en Go avec des canaux.
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
)
func main() {
// La notification de signaux Go fonctionne en envoyant des valeurs `os.Signal`
// sur un canal. Nous allons créer un canal pour
// recevoir ces notifications. Notez que ce canal
// devrait être tamponné.
sigs := make(chan os.Signal, 1)
// `signal.Notify` enregistre le canal donné pour
// recevoir des notifications des signaux spécifiés.
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
// Nous pourrions recevoir de `sigs` ici dans la fonction principale,
// mais voyons comment cela pourrait également être
// fait dans une goroutine séparée, pour démontrer
// un scénario plus réaliste d'arrêt propre.
done := make(chan bool, 1)
go func() {
// Cette goroutine exécute une réception bloquante de
// signaux. Lorsqu'elle en reçoit un, elle l'affichera
// puis avertira le programme qu'il peut se terminer.
sig := <-sigs
fmt.Println()
fmt.Println(sig)
done <- true
}()
// Le programme attendra ici jusqu'à ce qu'il obtienne le
// signal attendu (comme indiqué par la goroutine
// ci-dessus en envoyant une valeur sur `done`) puis il quittera.
fmt.Println("awaiting signal")
<-done
fmt.Println("exiting")
}
Le laboratoire Signaux montre comment gérer les signaux Unix dans des programmes Go à l'aide de canaux. En créant un canal tamponné pour recevoir des notifications os.Signal
et en enregistrant le canal pour recevoir des notifications de signaux spécifiés à l'aide de signal.Notify
, nous pouvons gérer les signaux de manière appropriée et quitter le programme lorsque le signal attendu est reçu.