Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menghalang Ctrl C daripada Mengganggu exec.Command dalam Go?

Bagaimana untuk Menghalang Ctrl C daripada Mengganggu exec.Command dalam Go?

Barbara Streisand
Barbara Streisandasal
2024-12-27 20:46:13780semak imbas

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

Menghalang Ctrl C daripada Mengganggu exec.Command di Golang

Apabila melaksanakan proses luaran menggunakan exec.Command, anda mungkin menghadapi isu di mana proses terganggu oleh Ctrl C walaupun anda telah memintas gangguan isyarat.

Tingkah laku ini berlaku kerana cangkerang memberi isyarat kepada keseluruhan kumpulan proses apabila Ctrl C ditekan. Proses induk menerima isyarat dan memajukannya kepada semua proses anak, menyebabkan proses itu terganggu.

Untuk mengelakkan ini, anda boleh menggunakan syscall.SysProcAttr untuk memulakan perintah dalam kumpulan prosesnya sendiri. Dengan menetapkan medan Setpgid kepada benar, anda mencipta kumpulan proses baharu untuk arahan itu, memisahkannya daripada proses induk.

Berikut ialah cara untuk mengubah suai contoh anda menggunakan 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
}

Kini, apabila anda menekan Ctrl C semasa pelaksanaan, hanya program utama akan menerima isyarat. Perintah tidur akan terus berjalan sehingga masa siapnya selama 60 saat. Ini memastikan proses tidak terganggu tanpa diduga.

Atas ialah kandungan terperinci Bagaimana untuk 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