Maison > développement back-end > Golang > Pourquoi « Process.Signal » ne tue-t-il pas les processus enfants dans Go ?

Pourquoi « Process.Signal » ne tue-t-il pas les processus enfants dans Go ?

Barbara Streisand
Libérer: 2024-11-27 17:37:15
original
315 Les gens l'ont consulté

Why Doesn't `Process.Signal` Kill Child Processes in Go?

Pourquoi ne va-t-il pas tuer un processus enfant à l'aide de Process.Signal ?

Dans l'extrait de code fourni, le processus est censé être tué à l'aide de cmd.Process.Signal(syscall.SIGKILL) après un délai d'attente spécifié. Cependant, le délai d'attente ne fonctionne pas correctement. Malgré l'impression de « C'est mort Jim », le processus continue de s'exécuter et « Terminé en attente » ne s'imprime jamais.

Le problème

Le problème ici est lié au fait que cmd.Process.Signal ne tue pas les processus enfants. Les processus enfants ont leurs propres groupes de processus et doivent être tués séparément.

Solution

Pour résoudre ce problème, une approche différente peut être adoptée en utilisant syscall.Getpgid et syscall.Kill :

import "syscall"

cmd := exec.Command(some_command)
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
cmd.Start()

pgid, err := syscall.Getpgid(cmd.Process.Pid)
if err == nil {
    syscall.Kill(-pgid, 15)  // note the minus sign
}

cmd.Wait()
Copier après la connexion

En utilisant SysProcAttr.Setpgid = true, un groupe de processus distinct est créé pour le processus enfant. Ensuite, syscall.Getpgid récupère l'ID de groupe de processus (pgid) du processus enfant. Enfin, syscall.Kill(-pgid, 15) est appelé pour envoyer un signal SIGTERM à l'ensemble du groupe de processus, tuant ainsi à la fois le processus enfant et ses processus enfants.

Avertissements

Cette solution peut ne pas fonctionner sur toutes les plateformes. Il a été confirmé qu'il fonctionne sur macOS et Linux, mais son comportement sur d'autres systèmes d'exploitation est incertain.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal