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

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

DDD
DDDasal
2024-12-14 00:20:16580semak imbas

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

Menghalang Ctrl C daripada Mengganggu exec.Command di Golang

Apabila melaksanakan arahan menggunakan exec.Command, adalah penting untuk mengetahui potensi untuk gangguan Ctrl C, walaupun isyarat.Notify telah digunakan untuk memintas isyarat tersebut. Isu ini boleh diperhatikan dalam contoh berikut:

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
}

Apabila menekan Ctrl C semasa program sedang berjalan, output menunjukkan bahawa arahan "tidur" akan terganggu, walaupun program utama terus berjalan:

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

Kunci untuk menyelesaikan isu ini terletak pada mengenali bahawa cangkerang memberi isyarat kepada keseluruhan kumpulan proses apabila Ctrl C ditekan. Tingkah laku ini boleh dihalang dengan memulakan arahan dalam kumpulan prosesnya sendiri menggunakan medan Setpgid dan Pgid dalam syscall.SysProcAttr:

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

Dengan memasukkan pengubahsuaian ini, arahan "sleep" tidak lagi akan diganggu oleh Ctrl C, membolehkan ia terus berjalan secara bebas.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghalang Ctrl C daripada Mengganggu `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