Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menghalang Ctrl C daripada Mengganggu Proses `exec.Command` dalam Go?

Bagaimanakah Saya Boleh Menghalang Ctrl C daripada Mengganggu Proses `exec.Command` dalam Go?

Patricia Arquette
Patricia Arquetteasal
2024-12-12 19:46:15228semak imbas

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

Menghalang Ctrl C Gangguan Exec.Proses Perintah

Walaupun memintas panggilan gangguan melalui isyarat.Maklumkan, proses dimulakan dengan exec.Command tetap terdedah kepada gangguan oleh Ctrl C. Pertimbangkan yang berikut demonstrasi:

package main

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

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

    go func() {
        log.Println("Sleep start")
        cmd := exec.Command("sleep", "60")
        cmd.Run()
        log.Println("Sleep stop")
    }()

    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
}

Menekan Ctrl C semasa pelaksanaan program akan menghasilkan output yang menunjukkan bahawa arahan "tidur" telah terganggu, walaupun program utama tidak keluar.

Penyelesaian: Mengawal Kumpulan Proses

Gangguan timbul daripada shell yang memberi isyarat kepada keseluruhan kumpulan proses apabila Ctrl C ditekan. Untuk mengasingkan proses anak daripada isyarat ini, arahan mesti dimulakan dalam kumpulan prosesnya sendiri. Ini boleh dicapai dengan menetapkan medan SysProcAttr.Setpgid dan SysProcAttr.Pgid sebelum memulakan proses:

cmd := exec.Command("sleep", "60")
cmd.SysProcAttr = &syscall.SysProcAttr{
    Setpgid: true,
}

Dengan mengikuti langkah ini, program utama boleh memintas isyarat Ctrl C tanpa mengganggu proses yang dimulakan dengan exec.Command , memastikan pelaksanaan proses yang stabil.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghalang Ctrl C daripada Mengganggu Proses `exec.Command` dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn