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!