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-11 02:26:11
Original
256 Leute haben es durchsucht

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

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

Unterbrechungen durch Strg C können auftreten, wenn exec.Command zum Initiieren von Prozessen verwendet wird. auch wenn Interrupt-Anrufe über signal.Notify abgefangen werden. Dieses Problem tritt auf, weil die Shell beim Empfang von Strg C Signale an die gesamte Prozessgruppe überträgt. Daher sind auch untergeordnete Prozesse betroffen, die mit exec.Command initiiert wurden.

Um dieses Problem zu mildern und zu verhindern, dass Strg C unterbrochen wird Für die untergeordneten Prozesse ist es notwendig, den Befehl mit einer eigenen Prozessgruppe zu etablieren, bevor mit der Ausführung begonnen wird. Dies kann durch die Verwendung der Felder SysProcAttr, Setpgid und Pgid der Struktur syscall.SysProcAttr erreicht werden.

Hier ist ein geändertes Beispiel, das diesen Ansatz beinhaltet:

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("Received Ctrl + C")
    }()

    <-doneChannel
}
Nach dem Login kopieren

Mit dieser Änderung, wann Wird Strg C gedrückt, während das Programm ausgeführt wird, erfolgt die folgende Ausgabe produziert:

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

Der Schlafbefehl wird weiterhin erfolgreich ausgeführt und zeigt die Verhinderung einer Unterbrechung durch Strg C.

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