web-dev-qa-db-fra.com

Comment envoyer un signal d'interruption dans Golang?

J'essaie actuellement d'implémenter une fonction qui appellerait un signal d'interruption dans Google Go. Je sais comment intercepter les signaux d'interruption de la console, en utilisant signal.Notify(interruptChannel, os.Interrupt), cependant, je ne trouve pas de moyen d'envoyer les signaux d'interruption. J'ai trouvé que vous pouvez envoyer un signal à un processus , mais je ne sais pas si cela peut être utilisé pour envoyer un signal d'interruption de niveau supérieur.

Existe-t-il un moyen d'envoyer un signal d'interruption depuis une fonction golang qui pourrait être capturé par tout ce qui écoute les signaux d'interruption du système, ou est-ce quelque chose qui n'est pas pris en charge dans golang?

9
ThePiachu

Obtenez le processus en utilisant FindProcess , StartProcess ou tout autre moyen. Appelez Signal pour envoyer l'interruption:

 err := p.Signal(os.Interrupt)

Cela enverra le signal au processus cible (en supposant que le processus appelant est autorisé à le faire) et invoquera tous les gestionnaires de signaux que le processus cible peut avoir pour SIGINT.

13
Cerise Limón

En supposant que vous utilisez quelque chose comme ça pour capturer le signal d'interruption

var stopChan = make(chan os.Signal, 2)
signal.Notify(stopChan, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)

<-stopChan // wait for SIGINT

Utilisez ci-dessous de n'importe où dans votre code pour envoyer un signal d'interruption à la partie d'attente ci-dessus.

syscall.Kill(syscall.Getpid(), syscall.SIGINT)

Ou si vous êtes dans le même package où la variable stopChan est définie. Le rendant ainsi accessible. Tu peux le faire.

stopChan <- syscall.SIGINT

Ou vous pouvez définir stopChan comme une variable globale (faire en sorte que la première lettre en majuscule obtienne la même chose), puis vous pouvez également envoyer un signal d'interruption à partir d'un autre package.

Stopchan <- syscall.SIGINT
24
Debasish Mitra