Le langage Go est un langage de programmation rapide et efficace. Il possède de bonnes fonctionnalités dans le développement de processus démons, telles que la prise en charge intégrée de la concurrence, des threads légers, un mécanisme de récupération de place, etc. Un démon est un programme qui peut être exécuté en arrière-plan. Il doit généralement s'exécuter pendant une longue période, en écoutant constamment les événements externes, tels que les demandes de connexion réseau, et en traitant les événements qui se produisent en conséquence. Cet article explique comment développer un processus démon en langage Go.
1. Exigences de base du processus démon
Dans les systèmes d'exploitation Linux et Unix, un processus démon doit répondre à certaines exigences de base :
2. Étapes pour implémenter un processus démon
Développer un processus démon en langage Go nécessite de suivre les étapes suivantes :
3. Détails d'implémentation
Créer un processus enfant et quitter le processus parentfunc startDaemon() { cmd := exec.Command(os.Args[0]) cmd.Start() os.Exit(0) }
Ce code démarrera un nouveau processus et quittez le processus actuel, faisant du nouveau processus un processus enfant du démon.
Créer un nouveau groupe de conversationfunc startDaemon() { syscall.Umask(0) if syscall.Getppid() == 1 { return } cmd := exec.Command(os.Args[0]) cmd.Start() os.Exit(0) ... sysret, syserr := syscall.Setsid() if syserr != nil || sysret < 0 { fmt.Fprintf(os.Stderr, "Error: syscall.Setsid errno:%d %v ", syserr, syserr) os.Exit(1) } }
Ce code définit d'abord le masque d'autorisation de fichier sur 0, puis vérifie si le processus en cours est déjà un groupe de conversation Le processus principal (c'est-à-dire si le processus parent est le processus d'initialisation). Si tel est le cas, il n'est pas nécessaire de créer un nouveau groupe de conversation. Sinon, appelez la fonction setsid() mentionnée ci-dessus pour créer un nouveau groupe de session et faire du processus actuel le leader du groupe de session.
Fermez le descripteur de fichierfunc startDaemon() { syscall.Umask(0) if syscall.Getppid() == 1 { return } cmd := exec.Command(os.Args[0]) cmd.Start() os.Exit(0) ... syscall.Close(0) // close stdin syscall.Close(1) // close stdout syscall.Close(2) // close stderr }
Ce code utilise la fonction Close() du package syscall pour fermer les descripteurs de fichier 0, 1, et 2.
Créer un répertoire inscriptiblefunc startDaemon() { syscall.Umask(0) if syscall.Getppid() == 1 { return } cmd := exec.Command(os.Args[0]) cmd.Start() os.Exit(0) ... os.Chdir("/") dir, _ := ioutil.TempDir("", "") fd, _ := os.Open(dir) syscall.Dup2(int(fd.Fd()), 0) syscall.Dup2(int(fd.Fd()), 1) syscall.Dup2(int(fd.Fd()), 2) }
Ce code change d'abord le répertoire de travail actuel du processus en répertoire racine (/), puis utilise le package ioutil La fonction TempDir() crée un nouveau répertoire sous le répertoire /tmp. Ensuite, utilisez la fonction os.Open() pour ouvrir le répertoire et utilisez la fonction Dup2() dans le package syscall pour copier ses descripteurs de fichier dans les descripteurs de fichier pour l'entrée standard, la sortie standard et l'erreur standard.
Charger les ressources requisesfunc main() { ... c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { <-c // 执行清理操作 os.Exit(0) }() ... }
Ce code utilise la fonction Signal() du package os pour transférer les signaux SIGTERM et SIGINT vers un pipeline respectivement pour le traitement. Ensuite, en écoutant ce tube dans une autre goroutine, vous pouvez effectuer des opérations de nettoyage lorsque ces signaux sont reçus.
4. Résumé
Cet article présente comment développer des processus démons en langage Go. Un démon est un programme de longue durée qui doit gérer divers événements externes. Il doit répondre à certaines exigences de base, comme avoir un processus parent, se mettre en arrière-plan lors du démarrage, etc. Les méthodes pour implémenter ces exigences dans le langage Go incluent la création d'un processus enfant et la sortie du processus parent, la création d'un nouveau groupe de sessions, la fermeture des descripteurs de fichiers, la création d'un répertoire inscriptible, le chargement des ressources requises et la gestion des signaux SIGTERM et SIGINT. En maîtrisant ces méthodes, nous pouvons développer librement des processus démons dans le langage Go.
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!