Heim > Backend-Entwicklung > Golang > Wie kann ich verhindern, dass Strg C „exec.Command' in Go unterbricht?

Wie kann ich verhindern, dass Strg C „exec.Command' in Go unterbricht?

DDD
Freigeben: 2024-12-14 00:20:16
Original
574 Leute haben es durchsucht

How Can I Prevent Ctrl C from Interrupting `exec.Command` in Go?

Verhindern, dass Strg C exec.Command in Golang stört

Beim Ausführen von Befehlen mit exec.Command ist es wichtig, sich des Potenzials bewusst zu sein für Strg-C-Unterbrechungen, auch wenn signal.Notify zum Abfangen solcher Signale verwendet wurde. Dieses Problem kann im folgenden Beispiel beobachtet werden:

package main

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

func sleep() {
    log.Println("Sleep start")
    cmd := exec.Command("sleep", "60")
    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
}
Nach dem Login kopieren

Wenn Sie Strg C drücken, während das Programm ausgeführt wird, zeigt die Ausgabe an, dass der Befehl „sleep“ unterbrochen wird, obwohl das Hauptprogramm weiterhin ausgeführt wird:

2015/10/16 10:05:50 Sleep start
^C2015/10/16 10:05:52 Receved Ctrl + C
2015/10/16 10:05:52 Sleep stop
Nach dem Login kopieren

Der Schlüssel zur Lösung dieses Problems liegt darin, zu erkennen, dass die Shell die gesamte Prozessgruppe signalisiert, wenn Strg C gedrückt wird. Dieses Verhalten kann verhindert werden, indem der Befehl in einer eigenen Prozessgruppe mithilfe der Felder Setpgid und Pgid in syscall.SysProcAttr gestartet wird:

cmd := exec.Command("sleep", "60")
cmd.SysProcAttr = &amp;syscall.SysProcAttr{
    Setpgid: true,
}
Nach dem Login kopieren

Durch die Einbindung dieser Änderung wird der Befehl „sleep“ nicht mehr unterbrochen Strg C, damit es unabhängig weiterlaufen kann.

Das obige ist der detaillierte Inhalt vonWie kann ich verhindern, dass Strg C „exec.Command' in Go unterbricht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage