Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menghalang Ctrl C daripada Mengganggu Proses `exec.Command` dalam Go?
Menghalang Ctrl C Gangguan Exec.Proses Perintah
Walaupun memintas panggilan gangguan melalui isyarat.Maklumkan, proses dimulakan dengan exec.Command tetap terdedah kepada gangguan oleh Ctrl C. Pertimbangkan yang berikut demonstrasi:
package main import ( "log" "os" "os/exec" "os/signal" "syscall" ) func main() { var doneChannel = make(chan bool) go func() { log.Println("Sleep start") cmd := exec.Command("sleep", "60") cmd.Run() log.Println("Sleep stop") }() 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 }
Menekan Ctrl C semasa pelaksanaan program akan menghasilkan output yang menunjukkan bahawa arahan "tidur" telah terganggu, walaupun program utama tidak keluar.
Penyelesaian: Mengawal Kumpulan Proses
Gangguan timbul daripada shell yang memberi isyarat kepada keseluruhan kumpulan proses apabila Ctrl C ditekan. Untuk mengasingkan proses anak daripada isyarat ini, arahan mesti dimulakan dalam kumpulan prosesnya sendiri. Ini boleh dicapai dengan menetapkan medan SysProcAttr.Setpgid dan SysProcAttr.Pgid sebelum memulakan proses:
cmd := exec.Command("sleep", "60") cmd.SysProcAttr = &syscall.SysProcAttr{ Setpgid: true, }
Dengan mengikuti langkah ini, program utama boleh memintas isyarat Ctrl C tanpa mengganggu proses yang dimulakan dengan exec.Command , memastikan pelaksanaan proses yang stabil.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghalang Ctrl C daripada Mengganggu Proses `exec.Command` dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!