Maison >développement back-end >Golang >Comment empêcher Ctrl C d'interrompre exec.Command dans Go ?

Comment empêcher Ctrl C d'interrompre exec.Command dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-27 20:46:13775parcourir

How to Prevent Ctrl C from Interrupting exec.Command in Go?

Empêcher Ctrl C d'interrompre exec.Command dans Golang

Lors de l'exécution de processus externes à l'aide de exec.Command, vous pouvez rencontrer un problème où le les processus sont interrompus par Ctrl C même si vous avez intercepté le signal d'interruption.

Ce comportement se produit parce que le le shell signale l’ensemble du groupe de processus lorsque Ctrl C est enfoncé. Le processus parent reçoit le signal et le transmet à tous les processus enfants, provoquant leur interruption.

Pour éviter cela, vous pouvez utiliser syscall.SysProcAttr pour démarrer la commande dans son propre groupe de processus. En définissant le champ Setpgid sur true, vous créez un nouveau groupe de processus pour la commande, en le séparant du processus parent.

Voici comment modifier votre exemple à l'aide de syscall.SysProcAttr :

package main

import (
    "log"
    "os"
    "os/exec"
    "os/signal"
    "syscall"
)

func sleep() {
    log.Println("Sleep start")
    cmd := exec.Command("sleep", "60")
    cmd.SysProcAttr = &syscall.SysProcAttr{
        Setpgid: true,
    }
    cmd.Run()
    log.Println("Sleep stop")
}

func main() {
    var doneChannel = make(chan bool)

    go sleep()

    c := make(chan os.Signal, 1)
    signal.Notify(c, os.Interrupt)
    signal.Notify(c, syscall.SIGTERM)
    go func() {
        <-c
        log.Println("Receved Ctrl + C")
    }()

    <-doneChannel
}

Maintenant, lorsque vous appuyez sur Ctrl C pendant l'exécution, seul le programme principal recevra le signal. La commande sleep continuera à s'exécuter jusqu'à son temps d'exécution de 60 secondes. Cela garantit que le processus n'est pas interrompu de manière inattendue.

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