Maison  >  Article  >  développement back-end  >  Golang dos ne sort pas

Golang dos ne sort pas

王林
王林original
2023-05-15 12:37:40624parcourir

Récemment, alors que j'utilisais Golang pour écrire un programme pour la plateforme Windows, j'ai rencontré un problème étrange : après avoir démarré le programme, je ne pouvais pas quitter le programme normalement via "Ctrl+C" ou en fermant la console. Une fois le programme terminé, vous pouvez toujours voir le processus qu'il exécute dans le gestionnaire de tâches, ce qui entraîne des ressources qui ne peuvent pas être libérées et qui affectent sérieusement les performances du système. Après avoir vérifié de nombreuses informations, j'ai finalement trouvé la raison pour laquelle le programme ne pouvait pas se terminer normalement et j'ai trouvé la solution.

Cause du problème

Dans Golang, il existe trois manières principales de quitter le programme :

  1. Call os.Exit to quittez le programme directement. Terminez le processus ;
  2. Appelez os.Process.Kill pour tuer le processus
  3. Le programme se termine activement une fois que toutes les coroutines sont terminées.

Cependant, sous la plateforme Windows, lorsque vous utilisez la méthode os.Exit ou os.Process.Kill pour quitter le programme, la console DOS ne se fermera pas normalement. En effet, sur la plate-forme Windows, la console DOS crée un nouveau groupe de processus lors du démarrage du programme, et le processus réel du programme et le processus de la console DOS ne se trouvent pas dans le même groupe de processus.

Lorsque la méthode os.Exit ou os.Process.Kill est utilisée pour quitter le programme, le processus du programme lui-même et le processus de la console DOS sortent respectivement de différents groupes de processus, ce qui entraîne l'échec de la fermeture de la console. normalement.

Solution

En cherchant une solution, j'ai trouvé une bibliothèque standard Golang avec un nom de package "os/signal", qui offre la possibilité de recevoir des signaux système et de traiter fonctionnent en conséquence. Ainsi, nous pouvons réaliser la sortie normale du programme en capturant le signal du système d'exploitation.

Les étapes pour utiliser la bibliothèque "os/signal" sont les suivantes :

  1. Utilisez la fonction signal.Notify pour enregistrer un ou plusieurs récepteurs de signal # ; 🎜🎜## 🎜🎜#Attendez la réception des signaux pendant l'exécution du programme et traitez les signaux reçus
  2. Après avoir traité le signal, vous pouvez effectuer de manière adaptative os.Exit ou d'autres opérations de nettoyage ; le programme.
  3. L'exemple de code est le suivant :
package main

import (
    "fmt"
    "os"
    "os/signal"
    "syscall"
)

func main() {
    fmt.Println("start program")
    sigs := make(chan os.Signal, 1)
    done := make(chan bool, 1)
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        sig := <-sigs
        fmt.Println()
        fmt.Println(sig)
        done <- true
    }()

    fmt.Println("waiting for signal")
    <-done
    fmt.Println("end program")
    os.Exit(0)
}

Dans le code ci-dessus, nous utilisons d'abord la fonction signal.Notify pour enregistrer le signal d'interruption du système SIGINT et le programmez le signal d’arrêt SIGTERM dans le récepteur de signal. Ensuite, lorsque le programme est en cours d'exécution, il attend la réception du signal. Lorsque le signal est reçu, le type de signal est émis et l'état du signal reçu est transmis au programme principal via le pipeline et est traité par le programme. programme principal. Enfin, une fois que le programme principal a traité le signal, quittez le programme normalement via os.Exit(0).

Résumé

Dans l'ensemble, Golang est un langage de programmation efficace, simple et sûr qui fournit une interface de bibliothèque simple et puissante lors du traitement des signaux système. Sous la plate-forme Windows, l'utilisation de la bibliothèque "os/signal" peut résoudre efficacement le problème de l'incapacité du programme à se terminer normalement. Cependant, il convient de noter que la définition des signaux peut être différente selon les environnements de système d'exploitation et que les ajustements correspondants doivent être effectués pour différents systèmes d'exploitation. Dans le même temps, lorsque vous utilisez des programmes de traitement du signal, vous devez également faire attention au nettoyage et à la libération des ressources globales pour éviter les fuites de ressources et la dégradation des performances du système.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn