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
Lepaskan: 2024-12-14 00:20:16
asal
575 orang telah melayarinya

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
}
Salin selepas log masuk

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
Salin selepas log masuk

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,
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan