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 = &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!